我们在某些基础架构代码中有以下类。它是我通常从PowerShell执行的MSBuild任务的一部分。我的PowerShell环境中可以使用所有Git命令;这不是Git问题。
public class Git
{
public static string GetCurrentBranch()
{
Console.WriteLine("Trying to find current Git branch...");
string branch = null;
/* git rev-parse --abbrev-ref HEAD */
var processStartInfo = new ProcessStartInfo("git", "rev-parse --abbrev-ref HEAD")
{
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false
};
var process = new Process();
process.ErrorDataReceived += (sender, args) => { branch += args.Data; };
process.OutputDataReceived += (sender, args) => { branch += args.Data; };
process.StartInfo = processStartInfo;
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
process.WaitForExit(5000); // Potential failure point?
Console.WriteLine("Git branch set to '{0}'", branch);
return branch;
}
}
大多数时候,我看到它写出这样的输出:
Trying to find current Git branch...
Git branch set to 'feature-multitenancy-steel-thread'
然而,在偶然的情况下 - 令我懊恼的是,当发生这种情况时,我无法找出一个模式 - 我得到这样的输出:
Trying to find current Git branch...
Git branch set to ''
这当我肯定在Git存储库中时,如果我直接执行它,git rev-parse --abbrev-ref HEAD
肯定会返回分支名称。我想知道WaitForExit()
调用是否可能没有等待足够长时间并且在设置分支之前它已经退出,但是当它失败时它似乎不需要五秒钟,而且我从未观察过{{1}无论如何,命令要花那么长时间。
因为我无法始终如一地重现这种情况,所以我想知道代码中是否显示我们是否使用rev-parse
错误或其他内容。任何可以在这段代码中打洞的C#/。NET大师?