Git操作中删除index.lock后已跟踪文件改动丢失该如何处理?
问题成因
执行git commit -am wip时,流程会先持有.git/index.lock锁、重写暂存区索引,再触发钩子校验。这次钩子校验失败导致进程异常中断,既没正常完成commit操作,也没走完锁释放、索引回滚的收尾流程:
- 残留的
index.lock本质是半写入完成的残缺索引临时文件,原本的有效索引被这个截断的残缺内容破坏 - 手动删除锁文件后,Git读取到的就是这个残缺索引,自然无法识别此前所有已暂存的已跟踪文件改动
找回改动的实操步骤
- 先把当前项目目录全量备份到仓库外的独立路径,全程不要在未备份的状态下执行索引重建、硬重置类操作,避免误覆盖现有改动
- 关闭所有占用当前仓库的Git相关进程(包括挂起的commit编辑窗口、后台运行的Git CLI/GUI程序),防止操作过程中再次产生锁冲突
- 执行
git fsck --lost-found扫描仓库内的无关联悬空对象:这些对象就是你此前执行git add --all时已经写入Git对象库、但因索引损坏没被关联的文件快照,命令执行后会在.git/lost-found目录下输出所有可恢复的对象哈希值 - 逐个通过
git show <悬空对象哈希>查看对象内容,匹配到对应丢失的文件改动后,将内容导出到工作区的原文件路径 - 所有丢失的改动全部确认找回后,重新执行
git add --all,即可正常把所有改动纳入暂存区
注意:如果操作过程中再次提示
index.lock文件存在,先确认没有其他Git进程在运行,再手动删除该锁文件即可,不要在锁存在的状态下强制执行其他Git命令
内容的提问来源于stack exchange,提问作者Stav Alfi
相关产品推荐
相关产品推荐

