本週從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 分支名稱
最終完美解決: