本周从git clone下载项目时由于项目过大,http方式报错protocol error: bad pack header
,ssh方式报错fatal: early EOF fatal: index-pack failed
期间查阅各种资料,也走了不少弯路,在此整理记录一下,特此分享。
问题描述
git clone用http方式下载报错如下:
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公钥配置的也没问题仍然报错
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配置:
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服务器做如下配置即可解决:
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下来,其他远程分支并不在本地,所以这种情况下,需要用如下方法拉取其他分支需要进行如下步骤
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 分支名称
最终完美解决: