我想从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();
}
}
答案 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();