【问题标题】:git.exe writes ErrorOutput even though no error occured [duplicate]即使没有发生错误,git.exe 也会写入 ErrorOutput [重复]
【发布时间】:2020-03-19 20:54:23
【问题描述】:

我在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:\Workspaces\MyRepo",
        CreateNoWindow = true,
        WindowStyle = ProcessWindowStyle.Hidden
    }
};
gitProcess.Start();
string outputString = null;
string errorString = null;
gitProcess.OutputDataReceived += (sender, args) => outputString = string.IsNullOrWhiteSpace(outputString) ? args.Data : $"{outputString}\r\n{args.Data}";
gitProcess.ErrorDataReceived += (sender, args) => errorString = string.IsNullOrWhiteSpace(errorString) ? args.Data : $"{errorString}\r\n{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 的工作方式。

谢谢。

【问题讨论】:

标签: c# git system.diagnostics


【解决方案1】:

感谢您的 cmets,这对您有所帮助。我特别研究了stdout和stderr的主要思想。 stderr 的想法似乎不仅仅是在命令失败时打印错误消息,而且还打印任何可能有助于理解该过程但您可能不希望在标准输出中出现的诊断信息。

这篇文章解释的很好: https://www.jstorimer.com/blogs/workingwithcode/7766119-when-to-use-stderr-instead-of-stdout

谢谢你们!

【讨论】:

    猜你喜欢
    • 2017-06-18
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2016-12-15
    • 2023-03-10
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    相关资源
    最近更新 更多