科技 · 實用指南
Git 回報 pack 損壞或 index-pack 失敗?先證明哪個邊界遺失位元組
在移動 pack、重新 clone 或執行垃圾回收前,區分本機 object database、傳輸截斷與遠端 pack 產生失敗。

pack checksum mismatch 與 invalid index-pack output 不一定屬於同一責任邊界;後者可能只是傳輸截斷或遠端產生器失敗的最後症狀。
不要先刪 pack、覆蓋唯一工作樹或執行 gc。保留首錯和 object database,證明邊界,從可信來源復原,再用 objects、refs、工作與可重複傳輸驗收。
保留首錯並凍結 object 寫入
保存命令、Git 版本、路徑、stderr、狀態、傳輸、去除憑證的 remote 及第一條 checksum、CRC、bad offset、early EOF 或 index-pack 訊息;暫停自動 gc、repack、prune、fetch、鏡像和備份。
製作檔案系統副本,另存未提交工作與 index 變更;移動或重建前記錄相關 .pack/.idx 名稱、大小和雜湊。
判斷本機、傳輸或遠端
已存 pack 的 checksum/CRC 指向 object database;clone 的 early EOF/invalid index-pack 也可能是傳輸截斷、空間、proxy/SSH 或遠端 pack-objects。
比較正常 client、新目的地和核准替代傳輸;單一舊 clone、單一 repo 全部 clone、或單一 client 全部 repo 的含義不同。
映射 pack、index、objects 與 refs
在副本執行 git fsck --full,對確切 idx/pack 執行 git verify-pack;index-pack 重建 index 的成功不代表必要 refs 全部可達。
分開 pack checksum、index checksum/CRC、bad offset、missing referenced object 和 dangling object,記錄依賴它們的 refs/commits。
從可信來源最小復原
可捨棄本機 clone 且 remote 已證明完整時,在新目錄 clone,保留本機變更並比對 commit ID;remote 損壞則用可信 backup 或 clone。
只還原確切 object 或驗證過的 pack;salvage 與 unpack-objects 只能在副本上,不能刪除原證據或對不完整庫執行 gc/prune。
以完整性、refs、工作與重現性結案
執行完整 fsck,核對 branches、tags、commit ID、未提交工作與關鍵 objects;一個 branch 可 checkout 不代表全部完好。
在新空目錄重跑 clone/fetch;只有完整性乾淨、refs 一致、工作已保留、傳輸不再截斷才結案。
