RPC failed curl 18 transfer closed with outstanding read data fatal protocol error bad pack header

本周从git clone下载项目时由于项目过大,http方式报错protocol error: bad pack header,ssh方式报错fatal: early EOF fatal: index-pack failed期间查阅各种资料,也走了不少弯路,在此整理记录一下,特此分享。

问题描述

git clone用http方式下载报错如下:
1
2
3
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly
fatal: protocol error: bad pack header
git clone用ssh方式下载报错如下:

SSH公钥配置的也没问题仍然报错

1
2
3
4
5
6
7
8
error: pack-objects died of signal 9/5818)
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed

错误如下图:

在这里插入图片描述

解决方案

第一种方案

网上说http方式报错protocol error: bad pack header需要配置ssh方式即可解决,但是在我的实际操作过程中,ssh方式爆出然报错fatal: early EOF fatal: index-pack failed等错误。

第二种方案

修改本地的git配置:

1
2
3
4
git config –global pack.windowMemory “100m”
git config –global pack.SizeLimit “100m”
git config –global pack.threads “1”
git config –global pack.window “0”

结果未能解决仍然报错。

第三种方案 浅克隆git clone –depth 1 项目地址

可能是下载的项目工程太大导致的,那我们就下载最近的一次commit就好了,即:git clone –depth 1 项目地址,我出现的现象是很快就下载到100%了,但是下载的是一个空文件夹,什么内容都没有,即下载失败

最终解决方案和原因分析

根据这两种错误,我查到的大部分的解决方案就是浅克隆(git clone –depth)、修改git配置:加大缓存区、修改压缩配置等(git config –global),但是未能解决我的问题,最后在一篇博客评论中看到是应该是git服务有问题,不是本地客户端的问题
需要修改git 服务端的配置,进部署git的服务器,不是打开本地命令窗。在git服务器做如下配置即可解决:

1
2
3
4
git config –global pack.windowMemory “100m”
git config –global pack.SizeLimit “100m”
git config –global pack.threads “1”
git config –global pack.window “0”
我的解决方式

将问题交给运维那边处理,运维那边说改配置比较麻烦怕影响其他的(我也没理解),只是简单改了一下,让我在试试浅克隆结果总算成功了如下图:
在这里插入图片描述浅克隆存在的问题:
浅克隆只会把默认分支clone下来,其他远程分支并不在本地,所以这种情况下,需要用如下方法拉取其他分支需要进行如下步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
step1:  浅克隆
git clone –depth 1 https://地址/xxxxxxx.git

step2:  cd  到新下载的项目根目录
cd   xxxxxxx

step3: 设置远程要拉取的地址
git remote set-branches origin  分支名称

step4: 浅克隆下载此分支
git fetch –depth 1 origin 分支名称

step5:切换到分支
git checkout 分支名称

Leave a comment