Watch at Ease看见世界,读懂生活。

科技 · 实用指南

Git 报“index file corrupt”?删除前先证明坏的是哪一种索引

暂存区索引、linked worktree 索引、split/sparse 索引与 pack 的 .idx 是不同故障。先保留可读的暂存账本并解析真实路径,只重建已证明的那一类,再核验对象并复现原流程。

区分工作树、split/sparse 与 pack 索引的示意图
原创插画:修复前先分类准确故障索引。 Watch at Ease

暂存区索引、linked worktree 索引、split/sparse 索引与 pack 的 .idx 是不同故障。先保留可读的暂存账本并解析真实路径,只重建已证明的那一类,再核验对象并复现原流程。

工作树 index 记录暂存条目,与对象数据库不是同一个结构。 .git 可以是指向真实 gitdir 的文本文件,因此 .git/index 不是通用路径。

1. 冻结准确错误路径并保留暂存证据

保存完整错误、目录、命令与时间。若 index 仍可读,导出 git diff --cached --binary 和 git ls-files --stage,并在 reset 前复制报错文件。暂存版本未必与工作树相同,之后重新 add 不一定等价。

不要先执行 rm -f .git/index。错误可能指向另一个 worktree 的 index 或 objects/pack/*.idx,直接删除也会抹去暂存意图的关键证据。

2. 解析真实 gitdir、worktree 与 index 身份

在同一 shell 与环境中运行 git rev-parse --show-toplevel、--git-dir、--git-common-dir 和 --git-path index。.git 文件可能重定向到别处,linked worktree 的私有状态也不一定在可见根目录下。

记录 GIT_DIR、GIT_WORK_TREE 与 GIT_INDEX_FILE。把错误路径与解析后的 index 比较;不同就先分类,不要套用普通工作树 index 方案。

3. 区分工作树、split/sparse 与 pack 索引

普通 index 是暂存账本。split index 还使用 sharedindex.<hash>;sparse checkout 使用 skip-worktree 位,也可能使用 sparse index。重建前保存配置与 git sparse-checkout list。

objects/pack 下的 .idx 是 pack 对象索引。删除暂存 index 无法修复它;先保护 pack 对,核验对象库,并走对象恢复或重新 clone 流程。

4. 只重建已证明损坏的索引类

确认是工作树 index 后,先移动备份而不是擦除,再从正确 worktree 执行 git reset --mixed 由 HEAD 重建。工作树文件保留,但暂存状态清空,要依据 cached diff 与 stage 清单谨慎恢复。

split 或 sparse 场景应在基础 index 可读后恢复受支持的 sparse-checkout 配置并 reapply。不要仅为让 status 成功就删除 sharedindex 或关闭 sparse。

5. 核验对象、暂存意图与同环境复发

运行 git status、git diff、git diff --cached,并用 git fsck --full 检查 commit、tree 与 blob。确认新增文件和仅暂存 hunk 已恢复或按证据明确重做。

在相同文件系统、worktree 与 sandbox 中重复原 status、checkout 或 CI 流程。若再次损坏,应调查存储、异常终止、并发写入、杀毒或 overlay;一次 reset 成功不代表根因消失。

保存、定向重建与验收示意图
原创插画:保留暂存证据,只改一类文件并核验。 Watch at Ease