Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

Git 回報 pack 損壞或 index-pack 失敗?先證明哪個邊界遺失位元組

在移動 pack、重新 clone 或執行垃圾回收前,區分本機 object database、傳輸截斷與遠端 pack 產生失敗。

原創插畫:區分本機 object database、傳輸路徑與遠端 pack 產生者。
原創插畫:先定位哪個邊界遺失或改變 pack 位元組。 Watch at Ease

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 一致、工作已保留、傳輸不再截斷才結案。

原創插畫:依本機損壞、傳輸截斷、object 缺失與 pack 損壞選擇復原。
原創插畫:採取最小復原並以 objects 與 refs 驗收。 Watch at Ease