テクノロジー · 実用ガイド

Git の「object file is empty」?削除前に OID を保全する

0バイトの loose object は削除対象ではなく証拠です。書き込みを止め、完全な OID と .git を保存し、損傷を分類してから正常な複製または作業ツリー救出を選びます。

書き込み停止、OID 保全、fsck 棚卸し、object 分類、正常コピー確認を示すオリジナル図。
オリジナルイラスト:削除前に object と repository の証拠を保全します。 Watch at Ease

「object file … is empty」は loose-object のパスがあるのに有効な object を読めない状態です。完全な OID と repository を証拠として扱い、空ファイル一括削除、reset --hard、.git 上書きから始めないでください。

Git の書き込みを止め、working tree と .git を別ストレージへコピーし、正確な OID を記録して読み取り中心の調査を行います。復旧は object type、到達可能性、remote・独立 clone・alternate・backup の正常コピー有無で決まります。

書き込みを止め証拠を保全

editor、IDE Git、background sync、maintenance を止めます。完全な error、path、OID、取得可能な status と crash、電源断、disk full、filesystem 症状を保存します。

working tree と .git を別ストレージへコピーし、0バイトの path を完全な OID 名で保全します。server の bare repository は write を止め platform の backup 手順へ進みます。

修復前に棚卸し

保全コピーで git fsck --full を実行し、reflog を root に含めない比較が必要なら --no-reflogs 出力も保存します。missing、bad、dangling、unreachable を分けます。

alternates、pack、refs、reflogs を確認し、単一か複数かを判断します。境界不明のまま gc、prune、reset --hard、一括削除をしません。

OID を分類し正常コピーを探す

fsck の link から blob、tree、commit、tag を分類します。blob は参照 tree と git ls-tree で path を特定できますが、commit と tree は安全な再構成が難しくなります。

独立 clone、remote、bundle、backup、alternate で完全な OID を照合します。remote に存在し local-only history が保全済みの場合だけ通常の fetch が候補です。

最小破壊の復旧を選ぶ

信頼できる場所に同じ object があれば Git-aware な経路または backup から戻し、OID と fsck を再確認します。別 repository の .git 全体を上書きしません。

blob を再構成できる場合はコピー上で git hash-object を実行し、OID が完全一致した時だけ書き込みます。それ以外は working tree を新しい clone へ救出し、破損側を保存します。

repository と storage を検証

到達可能 object の欠損・破損が消え、refs、history、作業変更が残り、新しい独立 clone が checkout できて初めて完了です。dangling だけなら正常な場合があります。

破損が再発、対象が増加、I/O・memory・power・filesystem error が出る場合は repository 修復を止め storage を調査し、検証完了まで backup を保持します。

正確な object 置換、working tree 救出、複数破損や storage 異常の停止を分ける決定図。
オリジナルイラスト:object と正常コピーを証明した場合だけ置換します。 Watch at Ease