Git diff se atasca cuando se ejecuta como process .NET

La ejecución de un Git diff se bloquea, hasta que se ejecuta cuando se ejecuta como System.Diagnostics.Process .

Código:

 class Program { static void Main(string[] args) { ProcessStartInfo pInfo = new ProcessStartInfo(); pInfo.FileName = "git.exe"; pInfo.Arguments = "diff --name-only --exit-code V2.4-Beta-01 HEAD"; pInfo.WorkingDirectory = @"C:\Git"; pInfo.UseShellExecute = false; pInfo.CreateNoWindow = true; pInfo.RedirectStandardError = true; pInfo.RedirectStandardOutput = true; Process p = new Process(); p.StartInfo = pInfo; p.Start(); p.WaitForExit(10000); if (!p.HasExited) { p.Kill(); Console.WriteLine("Killed!!!"); } Console.WriteLine(p.StandardOutput.ReadToEnd()); Console.WriteLine(p.StandardError.ReadToEnd()); Console.ReadLine(); } } 

¿Cómo evitar esto y hacer que el progtwig exista normalmente sin expirar su time de espera?

El problema es que alguien tiene que consumir el buffer de stdout o se llenará y el process será trabado (ver explicación aquí ). El diff que estaba tratando recuperó 983 líneas, lo que causaba un desbordamiento del búfer.

La siguiente es una solución a mi problema:

 class Program { static void Main(string[] args) { ProcessStartInfo pInfo = new ProcessStartInfo(); pInfo.FileName = "git.exe"; pInfo.Arguments = "diff --name-only --exit-code V2.4-Beta-01 HEAD"; pInfo.WorkingDirectory = @"C:\Git"; pInfo.UseShellExecute = false; pInfo.CreateNoWindow = true; pInfo.RedirectStandardError = true; pInfo.RedirectStandardOutput = true; string output = string.Empty; Process p = new Process(); p.StartInfo = pInfo; p.OutputDataReceived += new DataReceivedEventHandler((sender, e) => { if (!String.IsNullOrEmpty(e.Data)) { output += e.Data + Environment.NewLine; } }); p.Start(); p.BeginOutputReadLine(); p.WaitForExit(); p.Close(); Console.WriteLine(output); Console.ReadLine(); } }