Git执行pull报unpack-objects failed故障原因与修复方案咨询
故障成因
你怀疑的文件系统层级损坏是正确的,该问题的触发原因分为两层:
- 第一层初始损坏原因:你使用的WSL2环境存在跨进程并发写入的冲突风险,Docker Desktop读写WSL分区、PHP Storm的Git索引进程、手动执行的Git命令三个进程如果同时操作
.git/objects目录下的文件,加上WSL2假死、宿主机休眠唤醒、进程意外中断等场景,会导致正在写入的Git松散对象未完成IO就被中断,变成空文件,就是你第一次报错的loose object is corrupt的原因。 - 第二层后续报错原因:你手动删除损坏的空对象后,Git的增量存储机制中,该对象是其他delta增量对象的依赖基础,pull拉取的增量包需要基于该对象还原内容,找不到依赖就会抛出
unresolved deltas left after unpacking错误。
修复方案
分为两种场景按需选择:
场景1:需要保留旧仓库的本地未推送提交、工作区修改
- 先备份旧仓库的所有内容,尤其是工作区未提交的修改文件,避免操作丢失
- 重新克隆完整的远程仓库到新目录:
git clone <你的远程仓库地址> ./new_cp_repo - 将旧仓库的工作区修改文件复制覆盖到新仓库目录,不要覆盖新仓库的
.git文件夹 - 若需要恢复旧仓库的本地未推送提交,在新仓库目录执行
git fetch <旧仓库的绝对路径>,即可将旧仓库的所有提交记录拉取到新仓库,之后正常checkout到对应分支即可。
场景2:无需保留本地未推送提交,仅保留当前工作区内容
- 备份当前工作区的所有业务代码文件(排除
.git文件夹) - 删除当前仓库目录下的
.git文件夹 - 依次执行以下命令重建Git仓库关联:
git init git remote add origin <你的远程仓库地址> git fetch origin git checkout <你当前使用的分支名,比如main/master> git reset --mixed origin/<对应分支名>
- 执行完成后Git会自动对比本地工作区和远程分支的差异,不会覆盖现有文件,后续正常add、commit、pull即可。
预防建议
针对你的运行环境可以做以下优化避免再次出现该问题:
- WSL2环境下尽量避免Docker挂载读写、IDE自动Git同步、手动Git命令同时对同一个仓库执行写入操作
- 不要强制终止WSL进程、强制关机,宿主机休眠唤醒后等待1-2分钟让WSL2后台IO完成再操作Git
- 存在大量本地未推送提交时,提前备份
.git文件夹避免损坏丢失。
内容的提问来源于stack exchange,提问作者flaxon
相关产品推荐
相关产品推荐

