git报错:remote unpack failed: error Missing tree xxx

为何报错:

git在拉取完代码后准备本地代码推送到远程,执行 git push失败了

先上图:

git push报错提示

报错分析:

其实发生过好几次了,没找到git push报错原因,或许跟平时的操作习惯有关。
1、本人两部电脑开发,一部mac一部windows,代码在两台电脑上都会进行git操作(错误分析)
2、代码commit的时候经常git commit -m 'xxx'和 git commit -am 'xxx'混用(错误分析)
3、同事提交了我没拉取更新(不大可能,也是错误分析)

解决方法:

方法一、因为发生过好几次,所以之前的解决办法是git push origin --delete [远程分支名字]将远程分支删除,再git push -u origin [远程分支名字]将本地分支推送到刚删除的远程同名分支上就解决问题了

方法二、今天按方法一的操作发现不生效了,怎么推送都失败,后找到解决方法并尝试推送成功了,步骤如下:

1、首先切换到master分支上

git checkout master

2、更新master

git pull origin master

3、将推送报错的分支(dev)合并到master

git merge dev

4、推送到master(要有推送到master的权限)

git push origin master

5、再切换到推送报错的分支(dev)

git checkout dev

6、执行推送

git push origin dev

最后推送成功(不是绝对,也可能还是报错Missing tree,)网上其他方法是git push --no-thin xxx方法,我没有成功

方法三:最终解决方法

发生报错error: remote unpack failed: error Missing tree xxx的根本原因是我当初克隆代码使用的是浅克隆git clone --depth 1 xxx,快速克隆下代码后我再补齐的其他历史,但是.git/shallow 文件没被正确清理

只需执行git repack -a -d,该命令会检测到边界 commit 的父对象已存在,自动删除 .git/shallow,仓库升级为完整克隆。
git repack -a -d是 git 仓库的"整理打包"命令,拆开看:

序号 项目
repack 重新打包对象(把散落的 loose objects 合并成 pack 文件)
-a all — 把所有对象(包括已在 pack 里的)都重新打包成一个全新的 pack
-d delete — 打包完成后,删除旧的、被替代的 pack 文件和 loose objects

什么时候用:
1.仓库变慢时 — 整理对象能提升性能
2.空间占用异常时 — 回收旧 pack 和 loose objects 的空间
3.修复浅克隆问题时 — 就像我遇到的,repack 会检测并清理过期的.git/shallow标记
4.日常维护 — 一般不需要,git 的 auto-gc 会自动处理;手动跑通常是为了解决问题

长期建议

  • 克隆新项目时不要用--depth,除非明确只需要短期使用
  • 如果已经用了浅克隆,尽早git fetch --unshallow转完整
  • 如果方便可以升级git到更新的版本,对浅克隆的处理更稳健
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容