Gitで破損したファイル


8

私は最近、次のコマンドを使用してgit repos履歴からいくつかのフォルダーを削除しました:

git filter-branch --index-filter 'git rm -r --cached var' -- --all

残念ながら、このリポジトリからこれ以上プルすることはできません。これは私が取得しているエラーセットです。

git pull
remote: Counting objects: 3953, done.
remote: Compressing objects: 100% (2810/2810), done.
error: garbage at end of loose object '4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0'
fatal: object 4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 is corrupted
fatal: index-pack failed

どのLinuxシステムで変更を行いましたか?
Andres Jaan Tack

私は窓を使っていました。今私はLinuxを使用していますが、うまく機能します
mnml

回答:


7

ある種の魂これを自動的に(そしてより徹底的に)行うためのスクリプト書きましたが、回復するプロセスは基本的にこれです:

  1. ゴミを報告するファイルをhexdumpで調べます。

    $ hexdump .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    

    ゼロの巨大なスパンがあるファイルの一部を探しています。そのようなスパンが複数ある場合、ゼロ以外のデータの小さな実行が含まれている場合でも、最初の巨大なゼロのセットのみを検討すると、幸運でした(N = 2)。これはgitが不満を言う「ゴミ」です。

    ...
    0000500 0532 0302 0000 0000 0000 0000 0000 0000    # <-- Beginning here...
    0000510 0000 0000 0000 0000 0000 0000 0000 0000
    *
    0001000             # ... almost 3kb of zeros.
    

    これから、オブジェクトの実際のサイズを判別できます。ここでは、0x504または1,284バイトになります。

  2. オブジェクトのバックアップコピーを作成します。間違ったゼロのセットを選択した場合は、別のセットで再試行できます。

    $ cp .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 ~/old_4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    
  3. ファイルを適切な長さに切り詰めます。

    $ truncate -s 1284 .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    

破損したオブジェクトを修正する必要があります。それが唯一のものであると仮定すると、リポジトリのクローン/プッシュ/プルは期待どおりに機能するはずです。

私のソースを引用すると、同じ問題が発生したと思いますが、私の場合はUbuntu 10.4(カーネル2.6.32-23-generic)を使用しています。この場合、それはまだ追跡されていないファイルシステムのバグです。この問題と関連するusenetスレッドのecryptfsには未解決の問題があります。解決策の途中で、StackOverflowに関する便利な回答と概要を見つけました。リンク先の記事では、私が最終的に別の道を行ってきましたが、非常に興味深いものでした。


この回答ありがとうございます。git-remove-trailing-garbage.py(上記の「スクリプトを書いた」というテキストを含むリンク)は、あなたが言及した同じecryptfsバグに遭遇したときに私のベーコンを保存しました!
Adam Monsen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.