Git: object file .git/objects/** is emptyが発生したときの対処

Git: object file .git/objects/** is emptyが発生したときの対処


発生事象

いつものようにVS Codeを開き、ソースコードを変更して確認後、さてコミットしますかねと変更履歴を確認しようとしたところ・・・

alt text

このようなエラーが表示され、Gitを使うことができなくなっていました。

ちなみに裏で動いていたGitコマンドの結果はこれです。

git status -z -uall
error: object file .git/objects/6d/8b8cea3874d389a784533b606bd40246349663 is empty
error: object file .git/objects/6d/8b8cea3874d389a784533b606bd40246349663 is empty
fatal: bad object HEAD

状況

  • WSL上にクローンしたリポジトリをVSCodeで開いて作業していた
  • 普段からシャットダウンするときは、VSCodeを閉じずにシャットダウンしている

ファイルの詳細

statで対象のファイルを見てみます。

$ stat .git/objects/6d/8b8cea3874d389a784533b606bd40246349663
  File: .git/objects/6d/8b8cea3874d389a784533b606bd40246349663
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 8,48    Inode: 199407      Links: 1
Access: (0444/-r--r--r--)  Uid: ( 1000/      xx)   Gid: ( 1000/      xx)
Access: 2026-02-14 03:58:14.164906391 +0900
Modify: 2026-02-14 03:58:14.135947153 +0900
Change: 2026-02-14 03:58:14.135947153 +0900
 Birth: 2026-02-14 03:58:14.135947153 +0900

確かに0バイトです。

この時間にシャットダウンしたことは間違いないですが、眠かったのでどんな状態だったかはよく覚えていません。 (pull,pushなどをしている最中に電源を落としたのか?)

他にも同じようなファイルが存在するのか?

やっぱり他にもあるみたいやね。(松本人志)

$ find .git/objects -type f -size 0 -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\n' | sort
2026-02-14 03:58:14.1276730860 .git/objects/04/16a6ee27b0252854e4ab85636d73fafb456636
2026-02-14 03:58:14.1276730860 .git/objects/f8/d958f28ad81f3cdee3eb44bce62d12255f96cb
2026-02-14 03:58:14.1318101200 .git/objects/0c/7e86e3031c95c71a05e53df49e61f59317d985
2026-02-14 03:58:14.1318101200 .git/objects/12/1e787388ef3f099e22776676d452838deea383
2026-02-14 03:58:14.1318101200 .git/objects/48/c5cb810600673169e9a15d04661efcd56b73b0
2026-02-14 03:58:14.1318101200 .git/objects/8e/0ee2c984ed6359cb3d38114bca39624a181e53
2026-02-14 03:58:14.1359471530 .git/objects/6d/8b8cea3874d389a784533b606bd40246349663

対処

ひとまず現在の状態を退避して、別ディレクトリで復活させる

Gitは壊れましたが、ファイルは残っています。

一旦退避し、別途クローンしてから上書きしました。

元のディレクトリのGitの修復も試みる

  1. empty objectは不要なので消します。(一応対象を確認してから)

    find .git/objects -type f -size 0 -print
    find .git/objects -type f -size 0 -delete
    find .git/objects -type f -size 0 -print
  2. インデックスを削除

    rm -f .git/index
  3. remoteから再fetch

    git remote -v
    git fetch --prune origin