C#git命令行进程

时间:2016-01-08 04:13:00

标签: c# command-prompt git-bash git-config windows-process

我们的组织将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 shell到该目录
  • 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 :尝试获取git bash正在使用的ssh-agent进程并写入

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 我已经尝试查看此处的文档,似乎有enhancement request可以按照这些方式执行操作。

这两个似乎都有类似的问题尝试一个。 git shell似乎正在调用另一个进程,该进程处理与git shell分离的标准输入和输出。我对这最后两个的区别和希望是,有没有办法直接调用这些凭证管理器为不同的URL设置用户名/密码?在.git目录中,配置文件具有凭据设置,以告知它使用哪个管理器,并以纯文本形式存储用户名和电子邮件。

如果我通过机器上的shell调用git pull并通过该shell输入我的凭据,它似乎存储了它们,但有没有办法允许用户通过网站输入他们的凭据然后调用通过命令行进入管理器以安全地存储该信息以供将来自动使用?

我也遇到了this。我还没有机会尝试它,但这是否可以做到这样的事情?

非常感谢任何帮助。

0 个答案:

没有答案