我们的组织将 VisualStudioOnline、GitHub 和 BitBucket 用于各种存储库。我一直在尝试在 c# 中找到一种方法来定期自动执行pull
来自各种存储库的更改。git
我尝试过启动这样的过程,然后重定向标准输入/输出。
var p = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = @"C:\Program Files (x86)\Git\bin\sh.exe",
RedirectStandardInput = true,
UseShellExecute = false,
RedirectStandardOutput = true,
Arguments = "--login -i"
}
};
p.Start();
using (var so = p.StandardOutput)
{
using (var si = p.StandardInput)
{
if (si.BaseStream.CanWrite)
{
...
}
}
}
在块内部,我可以执行git
如下命令:
si.WriteLine("cd \"P:/code/testapp\"");
git
它将外壳导航到该目录si.WriteLine("git rev-parse HEAD");
这将为我提供该位置的存储库的最新哈希。
我可以看到在 bash shell 中返回的哈希值,也可以像这样通过标准输入读取它var hash = so.ReadLine();
当我尝试这样做时si.WriteLint("git pull");
,它会要求输入用户名和密码,这是我所期望的,但这不是通过标准输入/输出完成的。我无法var prompt = so.ReadLine();
获取用户名或密码的提示,也无法si.WriteLine("username");
在提示中输入密码。
我已经尝试了很多方法来让它工作,但到目前为止还没有运气。 警告:前面的代码乱七八糟,只是试图快速制作原型,而不是创造杰作
尝试 1:使用如上所示的标准输入/输出重定向来尝试写入/读取用户名/密码的提示。
尝试 2:尝试获取 bash 正在使用的 ssh-agent 进程git
并写入它
si.WriteLine("ssh-agent --help");
var sshAgentInfo = string.Empty;
var tmp = a.ReadLine();
while (a.Peek() != -1)
{
sshAgentInfo += tmp;
tmp = a.ReadLine();
}
var begPos = sshAgentInfo.IndexOf("SSH_AGENT_PID=", StringComparison.Ordinal);
begPos = begPos + "SSH_AGENT_PID=".Length;
var endPos = sshAgentInfo.IndexOf(";", begPos, StringComparison.Ordinal);
var processId = int.Parse(sshAgentInfo.Substring(begPos, endPos - begPos));
var sshProcess = Process.GetProcessById(processId);
sshProcess.StartInfo.RedirectStandardInput = true;
sshProcess.StartInfo.RedirectStandardInput = true;
using (var si1 = sshProcess.StandardInput) { ... }
尝试 3:利用凭证git config credential.helper wincred
这和四次是非常相似的尝试。再次只是想弄清楚如何从命令行在这些凭据管理器中设置密码。
尝试 4:利用Git-Credential-Manager-for-Windows 我已经尝试查看此处的文档,似乎有一个增强请求来执行这些操作。
这两个似乎都有类似的问题来尝试一个。git shell 似乎正在调用另一个处理与 git shell 分开的标准输入和输出的进程。不过,我对最后两个的区别和希望是,有没有办法直接调用这些凭证管理器来为不同的 url 设置用户名/密码?在 .git 目录中,配置文件具有凭据设置来告诉它使用哪个管理器,并将用户名和电子邮件以纯文本形式存储。
如果我通过机器上的 shell 调用 agit pull
并通过该 shell 输入我的凭据一次,它似乎会存储它们,但是有没有办法允许用户通过网站输入他们的凭据,然后通过命令行调用管理器来安全地存储该信息以供将来自动使用?
我也遇到过这个。我还没有机会尝试它,但这是一个可行的选择来做这样的事情吗?
任何帮助将不胜感激。