5

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

在此处输入图像描述

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

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();

    }
}
4

5 回答 5

4

你试过libgit2sharp吗?文档不完整,但它非常易于使用,并且有一个nuget 包。您也可以随时查看测试代码以了解使用情况。一个简单的克隆是这样的:

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());
}
于 2015-01-14T01:03:24.850 回答
3

从git clone的手册页:

--progress 进度状态在连接到终端时默认在标准错误流上报告,除非指定了 -q。即使标准错误流未定向到终端,此标志也会强制执行进度状态。

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

您最好根本不解析字符串输出,而是查看git clone. 如果它不为零,那么您有一个错误(并且可能会有一些标准错误,您可以向您的用户显示)。

于 2012-10-17T10:44:51.740 回答
2

一旦您调用process.WaitForExit()并且该过程已终止,您可以简单地使用process.ExitCodewhich 将获得您想要的值。

于 2012-10-17T10:38:56.770 回答
0

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

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

stderr.txt为空 stdout.txt:克隆到 'wget'...

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

25%

60%

100%

于 2012-10-17T13:06:14.050 回答
0
process.StandardError.ReadToEnd() + "\n" + process.StandardOutput.ReadToEnd();
于 2021-04-19T03:12:57.067 回答