1. ホーム
  2. git

[解決済み] ハードディスクの故障で破損したGitオブジェクトを復元するには?

2023-02-10 05:06:17

質問

ハードディスクが故障し、Git リポジトリの一部のファイルが破損してしまいました。その際 git fsck --full を実行すると、次のような出力が得られます。

error: .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack SHA1 checksum mismatch
error: index CRC mismatch for object 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid code lengths set)
error: cannot unpack 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid stored block lengths)
error: failed to read object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa at offset 276988017 from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack
fatal: object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa is corrupted

私はリポジトリのバックアップを持っていますが、パックファイルを含む唯一のバックアップは、すでに破損しています。ですから、異なるバックアップから単一のオブジェクトを取り出し、正しいオブジェクトだけを含む新しいパックを生成するよう、どうにかして Git に指示する方法を見つけなければならないと考えています。

私のリポジトリを修正する方法のヒントを教えてください。

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

以前のバックアップでは、不良オブジェクトが別のファイルに格納されていたり、まだルーズなオブジェクトである可能性があります。そのため、オブジェクトが復元される可能性があります。

データベース内にいくつかの不良オブジェクトがあるようです。そのため、手動で行うことができます。

なぜなら git hash-object , git mktreegit commit-tree は、パックの中にあるからといって、オブジェクトを書き込まないで、この作業を始めてください。

mv .git/objects/pack/* <somewhere>
for i in <somewhere>/*.pack; do
  git unpack-objects -r < $i
done
rm <somewhere>/*

(パックはリポジトリから移動され、再びリポジトリで解凍されます。良いオブジェクトだけがデータベースに登録されます)

することができます。

git cat-file -t 6c8cae4994b5ec7891ccb1527d30634997a978ee

で、オブジェクトの型を確認します。

タイプが blob の場合: ファイルの内容を以前のバックアップから取得します ( git show または git cat-file または git unpack-file であるならば git hash-object -w で現在のリポジトリにあるオブジェクトを書き換えることができます。

タイプがツリーの場合:あなたは git ls-tree を使って、以前のバックアップからツリーを復元することができます。 git mktree を実行して、現在のリポジトリに再度書き込みます。

タイプがcommitの場合: 同じく git show , git cat-filegit commit-tree .

もちろん、このプロセスを開始する前に、オリジナルの作業コピーをバックアップしておきます。

また、次のサイトもご覧ください。 破損した Blob オブジェクトを復元する方法 .