1. ホーム
  2. git

破損したGitオブジェクトファイルの対処法は?

2023-08-07 12:05:27

質問

クォータに近い状態でGit pullを行い、その結果(だと思う)、破損したファイルができてしまいました。

$ git pull
walk dffbfa18916a9db95ef8fafc6d7d769c29a445aa
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted

$ git fsck --full
bad sha1 file: .git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted

$ git cat-file -t d4a0e7599494bfee2b5351113895b43c351496b3
error: unable to find d4a0e7599494bfee2b5351113895b43c351496b3
fatal: git cat-file d4a0e7599494bfee2b5351113895b43c351496b3: bad file

この破損を解決するにはどうしたらよいでしょうか?

.git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp はゼロバイトでした。これを削除しても私の問題(同じエラー)は何も解決しませんでした。

どのように解決するのですか?

一般に、破損したオブジェクトを修正するのはかなり難しい場合があります。しかしこの場合、問題は転送の失敗、つまりオブジェクトがリモートリポジトリにあることだと確信しています。したがって、私たちのコピーを安全に削除し、今度は正しくリモートからそれを取得するようにgitに任せることができるはずです。

サイズがゼロの一時的なオブジェクトファイルは、明らかにただ削除することができます。それは私たちにとって何の役にも立ちません。それを参照している破損したオブジェクトは d4a0e75... が本当の問題です。それは .git/objects/d4/a0e75... . 上で言ったように、削除しても大丈夫そうですが、念のため、まずバックアップをとっておきましょう。

この時点で、新しい git pull は成功するはずです。

...最初の場所で成功するつもりだったと仮定して。この場合、ローカルでの変更がマージの試行を妨げたようなので stash , pull , stash pop が順番に並んでいました。これはどのようなマージでも起こりうることで、破損したオブジェクトとは何の関係もありませんでしたが。(インデックスのクリーンアップが必要で、その過程でスタッシュがそれを行ったのでなければ...ですが、私はそう信じていません)。