git push 失败,提示 unpack error/unpack failed 解决方法

时间:2021-02-20 16:24:41

【问题描述】
  在执行命令 git commit --amend 对提交进行修改后,再执行 git push review HEAD:refs/for/xxxx 将代码提交到 Gerrit 上,但是提交失败了并打印出下方这样的提示:

qidi.huang@droid10$ git push review HEAD:refs/for/xxxx

Writing objects: 100% (1/1), 258 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
error: unpack failed: error Missing tree a0abf7e9827e74b7d729485fcd3714bc6a1ce898
fatal: Unpack error, check server log
To ssh://qidi.huang@scgit.xxxx.com:29418/kernel/common
! [remote rejected] HEAD -> refs/for/xxxx (n/a (unpacker error))

 
【解决方法】
  我们可以在提交时加上 --no-thin 参数来解决这个问题,也就是说使用下方这样的命令来进行提交就可以了:

$ git push --no-thin review HEAD:refs/for/xxxx

  这个参数的含义是“在向服务器提交代码时不对信息进行压缩处理”,执行命令 git push --help 可以查看到说明信息:

--[no-]thin
These options are passed to git-send-pack(1). A thin
transfer significantly reduces the amount of sent data when
the sender and receiver share many of the same objects in
common. The default is --thin.

 
【问题原因】
  具体失败的原因应该从 Gerrit 服务器的 log 中进行分析,我没有去查看 log(好像我也没有权限),但根据其他同行的分析,这个问题可能是“Gerrit 与 git 不兼容导致的。具体原因是 git 提交时,在 Gerrit 生成了一个未关闭的 review 请求,但是这个请求并不属于任何一个提交”
 
【参考资料】
[1] 《git flow 与 gerrit》
[2] 《Git push error: unpack failed: index-pack abnormal exit》