1. 事象:何が起きたか
VSCodeでコミットや同期中に強制終了・連打等を行うと、Gitの内部オブジェクトが空(0バイト)で書き込まれ、リポジトリが破損することがあります。
.git/fsck
を実行すると、どこが壊れているか確認できます。
主なエラーログ:
error: object file .git/objects/XX/XXXXXX is empty
fatal: loose object XXXXXX is corrupt
fatal: missing object XXXXXX for refs/heads/main
git log や git push が一切受け付けられない状態になります。
2. 解決策:リポジトリの再構築
破損が広範囲(missing blob が複数発生)な場合、一つずつファイルを修復するより、.git フォルダを再生成してリモートの歴史と紐付け直すのが最短です。
手順
※ 作業ディレクトリのソースコードは保持されます。
# 1. 破損したGit管理情報の削除
rm -rf .git
# 2. Gitの再初期化
git init
# 3. リモートリポジトリの再登録
git remote add origin https://github.com/ユーザー名/リポジトリ名.git
# 4. リモートの履歴を取得
git fetch
# 5. 現在のファイルを保持したまま、履歴だけをリモートのmainに合わせる
git reset --mixed origin/main
# 6. (必要なら) masterブランチが生成された場合はmainにリネーム
git branch -m master main
# 7. 全ファイルをステージングして再コミット
git add .
git commit -m "fix: restore corrupted repository"
# 8. リモートへ強制プッシュ(歴史を一本化)
git push -f origin main
3. なぜこれで直るのか
-
.gitを消すことで、破損した「空のオブジェクト」や「壊れた履歴(reflog)」を完全に破棄できます。 -
git reset --mixedにより、「ファイルの実体は今のまま、Gitの管理名簿だけをリモートの状態に戻す」 ことができます。 - 足りなかったオブジェクト(missing blob)は、
git add時に現在のファイルから正しく再生成されます。
4. 教訓
- Git操作中(特にネットワーク通信中)にプロセスを強制終了しない。
- 万が一壊れたら、ソースコードが無事なうちにバックアップを取り、
.gitの再構築を検討する。