4

我们的组织将 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 输入我的凭据一次,它似乎会存储它们,但是有没有办法允许用户通过网站输入他们的凭据,然后通过命令行调用管理器来安全地存储该信息以供将来自动使用?

我也遇到过这个。我还没有机会尝试它,但这是一个可行的选择来做这样的事情吗?

任何帮助将不胜感激。

4

0 回答 0