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;不同就先分類,不要套用一般工作樹方案。

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