科技 · 實用指南
Git 顯示「object file is empty」?刪除前先保全物件 ID
零位元組 loose object 是儲存庫證據,不是清理目標。先停止寫入、保存完整物件 ID 與 .git、盤點損壞,再從可信副本恢復精確物件或搶救僅本機工作。

「object file … is empty」表示 loose-object 路徑存在,但 Git 無法讀取有效物件。把完整 OID 與周圍儲存庫當作證據;不要先批次刪除空檔、reset --hard 或覆蓋整個 .git。
停止 Git 寫入,把工作樹與 .git 複製到不同儲存,記錄精確 OID,再做唯讀盤點。恢復取決於物件類型、可達性,以及遠端、獨立 clone、alternate 或備份是否有可信副本。
停止寫入並保全證據
停止編輯器、IDE Git 整合、背景同步與維護。保存完整錯誤、路徑、OID、可取得的 status,以及當時的崩潰、斷電、磁碟滿或檔案系統症狀。
把工作樹與 .git 複製到不同儲存。以完整 OID 保存零位元組路徑,不要刪除;server bare repository 應先停寫並走平台備份流程。
修復前先盤點
在保全副本執行 git fsck --full;需要排除 reflog 根時另存 --no-reflogs 輸出。分開記錄 missing、bad、dangling 與 unreachable。
檢查 alternates、pack、refs 與 reflogs,判斷單一或多個物件。邊界不明時不要 gc、prune、reset --hard 或批次刪除空檔。
分類 OID 並找可信副本
用 fsck 引用鏈判斷 blob、tree、commit 或 tag。blob 可由引用 tree 與 git ls-tree 定位;commit 與 tree 更難安全重建。
在獨立 clone、遠端、bundle、備份和 alternate 核對完整 OID。只有遠端確有該物件且本機歷史已保全,fetch 才合適。
選擇破壞最小的恢復
若可信來源有精確物件,透過乾淨 Git 路徑或備份恢復,再驗證 OID 並重跑 fsck;不要覆蓋整個 .git。
若 blob 可重建,先對副本執行 git hash-object,僅在 OID 完全一致時寫入。否則搶救工作樹到新 clone,保留損壞儲存庫。
驗證儲存庫與儲存裝置
fsck 不再報告可達物件缺失或損壞、refs 可解析、歷史與修改仍在、全新 clone 可 checkout 才算恢復;只有 dangling 可能正常。
若損壞復發、更多物件失敗或出現 I/O、記憶體、電源、檔案系統錯誤,停止修復並檢查儲存;驗證前保留備份。
