我在System.Diagnosticsc.Process
的帮助下完成了一个git pull origin develop
,如下所示:
var gitProcess = new Process
{
StartInfo = new ProcessStartInfo
{
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
FileName = "git.exe",
Arguments = "pull origin develop",
WorkingDirectory = @"C:WorkspacesMyRepo",
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
}
};
gitProcess.Start();
string outputString = null;
string errorString = null;
gitProcess.OutputDataReceived += (sender, args) => outputString = string.IsNullOrWhiteSpace(outputString) ? args.Data : $"{outputString}rn{args.Data}";
gitProcess.ErrorDataReceived += (sender, args) => errorString = string.IsNullOrWhiteSpace(errorString) ? args.Data : $"{errorString}rn{args.Data}";
gitProcess.BeginErrorReadLine();
gitProcess.BeginOutputReadLine();
gitProcess.WaitForExit();
结果是:
gitProcess.ExitCode=0
outputString=已经是最新的。
errorString=来自https://mycompany.visualstudio.com/MyProject/_git/MyRepo*分支开发->FETCH_HEAD
现在一切似乎都很好,但git.exe为什么要将数据放入errorString?这似乎是正常的信息。这使得错误处理变得困难。ExitCode很好,它表示成功。
如果知道为什么会有错误数据,其他几个git命令也会以类似的方式出现这种情况。
预期答案
我不想听到在c#中做git pull的替代方案,这不是我的兴趣。我想了解git.exe的行为和System.Diagnostics.Process的行为,基本上我想了解错误数据是如何产生的以及为什么产生的。谁对此负责?是git.exe还是System.Diagnostics.Process的工作方式。
谢谢。
感谢您的评论,这很有帮助。我特别研究了stdout和stderr的主要思想。stderr的想法似乎不仅是在命令失败时打印错误消息,而且还打印任何可能有助于理解过程的诊断信息,但您可能不希望在标准输出中包含这些信息。
这篇文章很好地解释了这一点:https://www.jstorimer.com/blogs/workingwithcode/7766119-when-to-use-stderr-instead-of-stdout
谢谢你们!