[解決済み] ハードディスクの故障で破損したGitオブジェクトを復元するには?
質問
ハードディスクが故障し、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 mktree
と
git 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-file
と
git commit-tree
.
もちろん、このプロセスを開始する前に、オリジナルの作業コピーをバックアップしておきます。
また、次のサイトもご覧ください。 破損した Blob オブジェクトを復元する方法 .
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み] Git で、ステージされていない変更を破棄するにはどうしたらいいですか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
git commit to GitHub エラー、プロンプト ! [リモート拒否] master -> master (pre-receive hook declined) エラー: 失敗しました。
-
[解決済み] Git "破損したルースオブジェクト"
-
hint: 現在のブランチの先端が hint: そのリモートカウントより遅れているため、更新が拒否されました。
-
git occurs このリポジトリで別のgitプロセスが動作しているようです。例えば、.NETで開いたエディタなど。エラー
-
コミットメッセージが空だったため、コミットを中止する git commit
-
[解決済み] Gitのmasterブランチを、別のブランチから完全に置き換えるには?[重複]。
-
[解決済み】Gitで、あるブランチを別のブランチに「マージ」ではなく「上書き」するには?
-
[解決済み] Jenkins Pipeline Git SCM を認証情報でチェックアウトする?
-
[解決済み] gitにもsvnのような無視コマンドはありますか?
-
[解決済み] Git で孤立したコミットをブラウズする