【问题标题】:Cloning Git repository throwing ArithmeticException克隆 Git 存储库抛出 ArithmeticException
【发布时间】:2014-01-02 22:28:31
【问题描述】:

我们正在利用 Bonobo Git 服务器来托管一些内部 git 存储库。尝试检查我们的一个存储库时,我们收到此错误:

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 之间的数据类型问题。

【问题讨论】:

  • Bobobo 是否有可能将警告错误解释为来自服务器的非 vlid 答案?我发现的唯一其他类似情况表明远程端的 git install 存在问题(github.com/gitlabhq/gitlabhq/issues/3958#issuecomment-18077589)。我想这里不是这种情况,特别是如果“远程”在 localhost 上并且其他 repos 克隆就好了?
  • @VonC 我认为模板错误不是问题...如果我在本地克隆一个可以远程克隆的项目,我仍然会看到模板错误。但是,我确实意识到,克隆与上传包不同(对吗?),所以这不是一个公平的比较。我该如何测试?
  • 我提到的链接与模板无关,但既然你提到了它,请仔细检查你的 Git 安装(以及 Bonobo 进程使用的确切 git):也许它不完全/正确安装。
  • 现在,upload-pack 是克隆过程的一部分:github.com/git/git/blob/master/Documentation/technical/…,将客户端拥有的内容发送到服务器,以便服务器仅返回缺少的内容。是否像stackoverflow.com/a/9469744/6309 那样在 Bonobo 服务器端出现内存问题?
  • @VonC 很有趣...这绝对可能是内存问题。我将查看您链接的 SO 答案,实施并查看。谢谢!

标签: c# git arithmeticexception bonobo


【解决方案1】:

问题是由于响应缓冲了输出。它会在发送之前尝试在内存中缓冲整个流,并且对于大型存储库,这会导致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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多