Git: object file .git/objects/** is emptyが発生したときの対処
発生事象
いつものようにVS Codeを開き、ソースコードを変更して確認後、さてコミットしますかねと変更履歴を確認しようとしたところ・・・

このようなエラーが表示され、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の修復も試みる
-
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 -
インデックスを削除
rm -f .git/index -
remoteから再fetch
git remote -v git fetch --prune origin