克隆Git存储库抛出ArithmeticException

时间:2014-01-02 22:28:31

标签: c# git arithmeticexception bonobo

我们正在利用Bonobo Git Server来托管一些内部git repos。在尝试检出我们的某个存储库时,我们收到了此错误:

  

RPC失败;结果= 22,HTTP代码= 500

     

致命:远程端意外挂断

在Windows事件查看器中,它会记录以下消息:

Exception information: 
    Exception type: ArithmeticException 
    Exception message: Overflow or underflow in the arithmetic operation.
Request information: 
    Request URL: http://localhost:50287/MyRepo.git/git-upload-pack 
    Request path: /MyRepo.git/git-upload-pack 

如果我在本地调试Bonobo,则不会在C#中抛出异常;它来自git进程的外流。代码使用Process来运行git.exe,如下所示:

using (var process = System.Diagnostics.Process.Start(info))
{
    inStream.CopyTo(process.StandardInput.BaseStream);
    process.StandardInput.Write('\0');
    process.StandardOutput.BaseStream.CopyTo(outStream);

    process.WaitForExit();
}

传递给git的命令参数是:

  

upload-pack --stateless-rpc D:\ PathToRepos \ MyRepo

如果我在命令提示符下使用clone命令运行git.exe,项目将正确克隆(警告为templates not found

我认为这是C#与git流向Response.OutputStream之间的数据类型问题。

1 个答案:

答案 0 :(得分:2)

问题是由于缓冲输出的响应。它会尝试在发送之前将整个流缓冲在内存中,并且使用大型存储库会导致ArithmeticException。由于Response.Buffer默认为true,因此必须在发送数据之前将其明确设置为false。显然,数据也必须以块的形式读取和流式传输。

Response.Buffer = false;

while ((read = process.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
{
    Response.OutputStream.Write(buffer, 0, read);
    Response.OutputStream.Flush();
}