我正在尝试克隆存储库。我第一次达到82%,然后半小时没有让步,所以我取消了克隆并重新开始。在那之后,每次我尝试克隆它,我得到6-10%之间,然后它失败,错误“远程端意外挂断,早期EOF。”我查找错误并尝试了我能找到的每个解决方案,最流行的解决方案是将postBuffer增加到最大尺寸。但是,它每次都会一直失败。
我不确定它是否有所作为,但我不是在尝试检查代码,这是大多数其他报告此问题的人似乎试图做的事情。我正在尝试克隆存储库。
如果这是一个http事务,您需要联系BitBucket支持他们来诊断服务器端出了什么问题。
正如在“howto/use-git-daemon
”中提到的那样:
fatal: The remote end hung up unexpectedly
这只意味着出了问题。 要找出问题所在,您必须询问服务器。
请注意,当BitBucket使用Git 2.5 +(2015年第2季度)时,客户端可能最终会出现更明确的错误消息:
request was larger than our maximum size xxx
try setting GIT_HTTP_MAX_REQUEST_BUFFER"
(也就是说,在Git存储库托管服务器上设置GIT_HTTP_MAX_REQUEST_BUFFER
)
请参阅commit 6bc0cb5撰写的Jeff King (peff
),2015年5月20日。
(Junio C Hamano -- gitster
--在commit 777e75b合并,2015年6月1日)
测试改编自:Dennis Kaarsemaker (seveas
)
新的环境变量是GIT_HTTP_MAX_REQUEST_BUFFER
:
可以设置
GIT_HTTP_MAX_REQUEST_BUFFER
环境变量(或http.maxRequestBuffer
配置变量)来改变git在获取期间将处理的最大ref协商请求;任何需要更大缓冲区的提取都不会成功。通常不需要更改此值,但如果从具有极大数量的refs的存储库中提取,则可能会有所帮助。
可以用单位指定该值(例如,
100M
为100兆字节)。默认值为10 MB。
解释非常有趣:
http-backend
:假脱机的ref ref协商请求当
http-backend
产生“upload-pack
”进行ref协商时,它将http请求体流式传输到upload-pack
,然后In at least one documented case在读取时将http响应流回客户端。 从理论上讲,git可以全双工;客户端在发送请求时可以使用我们的响应。 然而,在实践中,HTTP是半双工协议。 即使我们的客户端已准备好同时读写,我们也可能有其他HTTP基础设施,包括生成我们的CGI的Web服务器,或任何中间代理。
upload-pack
,这会在尝试通过http获取时导致死锁。 基本上会发生什么:
- Apache将请求代理到CGI,http-backend。
- http-backend gzip-inflate数据并将结果发送到upload-pack。
- upload-pack对数据起作用,并通过管道生成输出回Apache。 Apache没有阅读,因为它正忙于写作(步骤1)。
这在大多数情况下工作正常,因为
upload-pack
输出最终在系统管道缓冲区中,并且Apache在完成写入后立即读取它。但是如果请求和响应都超过系统管道缓冲区大小,那么我们就会死锁(Apache阻止写入http-backend,http-backend阻止写入upload-pack,以及upload-pack阻止写入Apache)。我们需要通过假脱机输入或输出来打破僵局。在这种情况下,理想的是假脱机输入,因为在我们消耗了所有输入之前,Apache不会开始读取stdout或stderr。因此,在我们这样做之前,我们甚至无法向客户端发送错误消息。
解决方案非常简单:我们将请求主体读入http-backend中的内存缓冲区,释放Apache,然后将数据自己提供给
git clone --depth=20 https://repo.git -b master
。
通过克隆单个分支或仅克隆过去历史的一定数量来减少回购的大小的一种选择。
qazxswpoi
将仅将主分支克隆到20个提交的深度。由于这是一个小得多的实体,它通常可以工作,然后你可以获取其他分支。不确定你是否可以恢复历史,但是对于很多很多不重要的案例。