错误:RPC失败;curl传输关闭,但仍有未读数据。

222

当我尝试从GitLab(GitLab 6.6.2 4ef8369)克隆存储库时,我遇到了这个错误:

remote: Counting objects: 66352, done.
remote: Compressing objects: 100% (10417/10417), done.
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

然后克隆被中止。我该如何避免这种情况?

27个回答

343

这种情况时有发生,我经常会遇到网络连接慢的问题,必须克隆一个相当庞大的 Git 存储库。最常见的问题是连接关闭,整个克隆操作被取消。

Cloning into 'large-repository'...
remote: Counting objects: 20248, done.
remote: Compressing objects: 100% (10204/10204), done.
error: RPC failed; curl 18 transfer closed with outstanding read data remaining 
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

经过多次尝试和许多“远程端突然挂断”的错误后,我找到了一种适合我的方法。这个想法是先进行浅克隆,然后使用其历史记录更新存储库。

$ git clone http://github.com/large-repository --depth 1
$ cd large-repository
$ git fetch --unshallow

23
这是唯一描述解决问题的方法,而不需要切换到SSH的答案。这个方法对我有效,谢谢! - garie
27
关键在于使用参数 --depth 1--unshallow。如果需要在网速较慢的情况下获取现有的代码库,也可以这样做:先运行 git fetch --depth 1,然后再运行 git fetch --unshallow - Andrew T.
5
现在,执行git fetch --unshallow命令会出现“RPC failed”错误。 - ms_27
3
对我没用。在 git fetch --unshallow 失败了。我猜我的仓库太大了,即使使用这种方法也不行。只有 SSH 能用。 - Jonathan Cabrera
13
如果 git fetch --unshallow 仍然报错,你可以使用 git fetch --depth=100,然后 git fetch --depth=200,再然后 git fetch --depth=300,以此类推逐渐增加深度来获取代码库。这种方法适用于非常庞大的 Linux 内核代码库。 - haolee
显示剩余8条评论

108

几天后,今天我终于解决了这个问题。生成ssh密钥,请按照这篇文章:

https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/

声明到以下位置:

  1. Git提供商(我正在使用的是GitLab,GitHub)。
  2. 将此添加到本地身份验证。

然后通过命令克隆:

git clone username@mydomain.com:my_group/my_repository.git

而且没有发生错误。

以上问题

错误:RPC 失败;curl 18 传输被关闭,但有未读取完的数据剩余。

因为使用 HTTP 协议克隆时发生了错误(curl 命令)。

另外,您应该增加缓冲区大小:

git config --global http.postBuffer 524288000

11
对我来说,将工作从HTTP改为SSH。配置'http.postBuffer'没有生效。 - thangdc94
4
更改http.postBuffer 的值对我有用 - 谢谢! - Negar Zamiri
1
对我来说也起作用了,通过一个缓慢的 VPN 连接拉取一个大型解决方案。 - Ilias.P
2
注意:当我提高postBuffer时,使用npm publish时遇到了几个问题。当我将其设置为50000000时,问题消失了。默认值是1000000。 - Martin Braun
1
将 http.postBuffer 改为 524288000 对我有用。谢谢。 - Anju mohan
显示剩余3条评论

46

你需要关闭压缩功能:

git config --global core.compression 0

那么你需要使用浅克隆(shallow clone)。

git clone --depth=1 <url>

最重要的步骤是进入您克隆的项目所在的目录

cd <shallow cloned project dir>

现在逐步打开克隆

git fetch --depth=N, with increasing N
eg.
git fetch --depth=4
然后,
git fetch --depth=100
然后,
git fetch --depth=500

你可以通过替换 N 来选择您想要的步骤数量,

最后使用以下方法下载所有剩余的修订版本,

git fetch --unshallow 

如果这篇文章对你有帮助,请点赞 :)


2
这是唯一对我有效的选项。在我的情况下,错误发生在: git clone --depth=1 <url> 然而,根据您的指示,我首先执行了以下操作: git config --global core.compression 0 然后执行所有后续步骤,一切都很顺利! PS:我有良好的互联网连接,只是今天表现得有些奇怪。谢谢! - Slipmp
3
你能详细说明禁用压缩有什么作用吗? - Slim
5
@Slim 在这里我们所做的是禁用默认的压缩完整对象并获取的行为。相反,我们在获取时不进行压缩,这使我们能够通过指定深度逐步获取。 - NikhilP

22

当我尝试从远程克隆时,反复遇到相同的问题:

remote: Counting objects: 182, done.
remote: Compressing objects: 100% (149/149), done.
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

最终这个方法适用于我:

git clone https://username@bitbucket.org/repositoryName.git --depth 1

8
--depth 1 的作用是只显示当前目录下一层的文件或文件夹,不会递归显示子目录的内容。 - Wahdat Jan
如果源代码库是完整的,则将浅代码库转换为完整的代码库,消除浅代码库所施加的所有限制。如果源代码库是浅的,则尽可能获取更多内容,以便当前代码库具有与源代码库相同的历史记录。 - Rahman Rezaee
但是我不想“克隆”,我想要“推送”。如何进行深度推送? - Lars

12

简单解决方案:不要使用https进行克隆,而是使用ssh进行克隆。

例如:

git clone https://github.com/vaibhavjain2/xxx.git - Avoid
git clone git@github.com:vaibhavjain2/xxx.git - Correct

是的,我是Windows用户。 - Vaibhav Jain

9

网络连接问题。
可能是由于持续连接超时引起的。
最好的方法是切换到另一个网络。


1
更换了wifi以获得更快的互联网连接,然后它就能运行了。感谢您节省了我的时间。 - Kharthigeyan

6
这些步骤对我有用:使用git://而不是https://

1
实际上,这个答案比本帖中的其他答案更具体。 - xxxvodnikxxx

6
如上所述,首先从bash中运行您的git命令,并在开头添加增强的日志指令:GIT_TRACE=1 GIT_CURL_VERBOSE=1 git ... 例如:GIT_CURL_VERBOSE=1 GIT_TRACE=1 git -c diff.mnemonicprefix=false -c core.quotepath=false fetch origin。这将显示详细的错误信息。

6

通常情况下,由于以下原因之一而发生:

  1. 网络速度慢。
  • 在获取数据时,使用稳定的网络连接LAN电缆,避免同时进行任何并行的网络密集型任务。
  1. 从您正在尝试提取的服务器端出现小的TCP/IP连接超时。
  • 您无法做太多事情。您所能做的就是请求您的系统管理员或负责CI/CD团队增加TCP/IP超时并等待。
  1. 服务器负载过重。
  • 由于工作时间内服务器负载过重,下载大文件可能会不断失败。在开始下载后,请将机器留给它整晚。
  1. 客户端机器上的小HTTPS缓冲区。
  • 增加发送和请求的缓冲区大小可能有所帮助,但不能保证。

git config --global http.postBuffer 524288000

git config --global http.maxRequestBuffer 524288000

git config --global core.compression 0


4

对于我来说,问题是在整个克隆完成之前连接就已经关闭了。我使用了以太网连接而不是wifi连接。这样就解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接