error: 远程解包失败:error Missing commit xxx

当源码汇入gerrit过程中,部分仓库可能会有类似如下报错:

/home/xxx/Project/Android/aosp/kernel/prebuilts/4.19/arm64
枚举对象中: 15, 完成.
对象计数中: 100% (15/15), 完成.
使用 16 个线程进行压缩
压缩对象中: 100% (14/14), 完成.
写入对象中: 100% (15/15), 37.12 MiB | 10.63 MiB/s, 完成.
总共 15(差异 0),复用 0(差异 0),包复用 0
error: 远程解包失败:error Missing commit a51c5febf3fb291d9258fa41176972e55b942f3c
fatal: Unpack error, check server log
To ssh://192.168.1.1:29418/kernel/prebuilts/4.19/arm64
 ! [remote rejected] android-13.0.0_r52 -> android-13.0.0_r52 (n/a (unpacker error))
error: 无法推送一些引用到 'ssh://192.168.0.100:29418/kernel/prebuilts/4.19/arm64'

根本原因:
应该是部分repo源克隆项目的时候为了节省空间加快速度,使用浅克隆,所以本地git项目只有最新的提交记录,并且有他的父级commit id,这也是导致missing commit的原因。

查看了该项目的提交日志,并没有发现这个commit,但服务器解包的时候却能无中生有。

如果还能访问之前的远程仓库可以取回完整的提交历史记录。

如果旧的服务器已经没法访问了,可以在git项目下执行git filter-branch -f -- --all,这个命令会重置所有分支,使得那些持有无效commit的提交作为分支的根,也就不再有父级提交了。

查看.git/object存在对应的commit信息,如果缺少object信息,依然可能重建失败

解决方法:
1,如果能连接原库,链接后拉取完整提交记录
2,不能连接原库
1,判断是否为浅克隆
git rev-parse --is-shallow-repository
2,如果是浅克隆,就重建分支
git filter-branch -f -- --all
3,使用更安全,更有效的工具
git filter-repo --force
4,如果依然重建失败,检查.repo/object是否完整,如果不完整,可能失败
5,如果object不完整,尝试手动补充完整(危险⚠️注意⚠️)

posted @ 2025-04-15 11:45  东岸  阅读(120)  评论(0)    收藏  举报