4

ここで見ることができる壊れたブロブオブジェクトがあります

> git fsck --full
エラー: 5426a4097ea6a3597a1674b0b7fa67f395006f2a ヘッダーを解凍できません
エラー: inflateEnd: ストリーム整合性エラー (メッセージなし)
致命的: 緩いオブジェクト 5426a4097ea6a3597a1674b0b7fa67f395006f2a (.git/obj に保存)
ects/54/26a4097ea6a3597a1674b0b7fa67f395006f2a) が破損しています

git cat-file -t 542... 同じヘッダーを解凍できないエラーもあります

他のマシンをチェックしましたが、すべてが破損したバージョンです。

私はこのプロセスを進めました - http://www.kernel.org/pub/software/scm/git/docs/v1.7.10.1/howto/recover-corrupted-blob-object.txtそしてそれを特定のものに絞り込みましたファイル (Site.css) と日付範囲 (前後のコミット) が含まれていますが、ファイルを回復するために変更を再構築することはできません。これは、かなり大きな一連の変更の一部であり、長い間行われていたためです。前: とても昔のことなので、その歴史についてはあまり気にしません。

前後のコミットのハッシュを取得したので、その履歴の一部を忘れるために何かできることはありますか? リベースのようなものです (ただし、リベースは失敗すると思いますが、まだ試していません!)

4

2 に答える 2

4

git-replaceマンページを見てください。置換メカニズムにより、古いブロブの代わりに別のハッシュを持つ新しいブロブをドロップできます。これはあなたのために働くかもしれません。

于 2013-01-11T18:05:54.353 に答える
2

これが私がすることです。より洗練された解決策があるかもしれませんが、必要な場所に到達できるものについては、これでうまくいきます。

必要なもの:

  • ダフブロブを導入したコミットの直前のコミットの SHA1 <LastGoodCommit>
  • ダフ BLOB を含むコミットの SHA1 <BadCommit>

するべきこと:

  1. ダフ コミットを含むすべてのブランチとタグのリストを取得し、これらを保存します。

    git branch --contains <BadCommit> >branches.txt
    git tag --contains <BadCommit> >tags.txt
    
  2. 良いコミットをチェックしてください:

    git checkout <LastGoodCommit>
    
  3. 不良ブロブを含むコミットを置き換える新しいコミットを作成します。

    を使用git cherry-pick -n <BadCommit>して変更を取得できる場合とできない場合があります。私はそれをテストすることはできませんので、自分で試して何が起こるかを確認する必要があります. うまくいかない場合は、を使用して個々のファイルとディレクトリをチェックアウトできるはずですgit checkout <BadCommit>:<path>

    site.cssこのコミットでそのファイルをどのように表示するかを決める必要があります。2 つのオプションが表示されます。

    • 入っていたままにしておくだけ<LastGoodCommit>

    • 次回site.css、いずれかのブランチで適切なブロブを見つけて (理想的な状況: すべてのブランチで同じです)、それを使用します。

    どちらにしても、新しいコミット ハッシュに注意してください<NewGoodCommit>

  4. 上記の一覧にある、不適切なコミットを含むすべてのブランチbranches.txtをこの新しいコミットにリベースします。ステップ 3 で選択したオプションによっては、マージの競合が発生する場合があります。新しいバージョンのファイルを使用してこれらを解決するだけです。

    すべてのブランチに同じ次のバージョンの が含まれている場合site.css、衝突が発生しないと確信でき、次のワンライナーを使用してすべてのリベースを実行できます。

    while read branchname; do git rebase --onto <NewGoodCommit> <BadCommit> "$branchname" || echo "Failed rebasing $branchname" && break; done
    
  5. タグ ( tags.txt) を確認し、新しくリベースされたブランチでそれぞれのタグの置換を作成します。残念ながら、これを自動化する方法はわかりません。

于 2013-01-11T17:30:01.997 に答える