使用c#获取git命令行返回值

时间:2012-10-17 10:31:39

标签: c# git

我想从c#运行git命令。下面是我编写的编码,它确实执行git命令,但我无法捕获返回值。当我从命令行手动运行它时,这是我得到的输出。

enter image description here

当我从程序中运行时,我唯一得到的是

Cloning into 'testrep'...

其他信息不是捕获,但命令执行成功。

class Program
{
    static void Main(string[] args)
    {
        ProcessStartInfo startInfo = new ProcessStartInfo("git.exe");

        startInfo.UseShellExecute = false;
        startInfo.WorkingDirectory = @"D:\testrep";
        startInfo.RedirectStandardInput = true;
        startInfo.RedirectStandardOutput = true;
        startInfo.Arguments = "clone http://tk1:tk1@localhost/testrep.git";

        Process process = new Process();
        process.StartInfo = startInfo;
        process.Start();

        List<string> output = new List<string>();
        string lineVal = process.StandardOutput.ReadLine();

        while (lineVal != null)
        {

            output.Add(lineVal);
            lineVal = process.StandardOutput.ReadLine();

        }

        int val = output.Count();
        process.WaitForExit();

    }
}

5 个答案:

答案 0 :(得分:2)

致电process.WaitForExit()并且流程已终止后,您只需使用process.ExitCode即可获得所需的价值。

答案 1 :(得分:2)

你试过libgit2sharp吗?文档不完整,但它很容易使用,并且它有nuget package。您也可以随时查看test code以了解使用情况。一个简单的克隆就像这样:

string URL = "http://tk1:tk1@localhost/testrep.git";
string PATH = @"D:\testrep";
Repository.Clone(URL, PATH);

获取更改也很容易:

using (Repository r = new Repository(PATH))
{
    Remote remote = r.Network.Remotes["origin"];
    r.Network.Fetch(remote, new FetchOptions());
}

答案 2 :(得分:1)

来自git clone的手册页:

  

- 进展   附加到标准错误流时,默认情况下会报告进度状态   终端,除非指定-q。即使标准,此标志也会强制进度状态   错误流不会定向到终端。

以交互方式运行git clone时输出中的最后三行被发送到标准错误,而不是标准输出。但是,当您从程序运行命令时,它们不会显示在那里,因为它不是交互式终端。您可以强制它们出现,但输出不会是程序可以解析的任何内容(许多\r来更新进度值。)

最好不要解析字符串输出,而是查看整数返回值git clone。如果它不为零,则表示您有错误(标准错误可能会显示给您的用户)。

答案 3 :(得分:0)

您的代码看起来不错。 这是git问题。

git clone git://git.savannah.gnu.org/wget.git 2> stderr.txt 1> stdout.txt

stderr.txt 为空 的 stdout.txt : 克隆到&#39; wget&#39; ...

看起来git没有使用标准的console.write()之类的输出,当它写入百分比时,你可以看到它在一行中不是这样的: 10%

25%

60%

100%

答案 4 :(得分:0)

process.StandardError.ReadToEnd() + "\n" + process.StandardOutput.ReadToEnd();