2

VMを強制的にシャットダウンした後、このgitメッセージが表示されました。これにより、明らかにgitインデックスが破損しました。

Git: Failed to read object abcdef.... Invalid argument

私はこれらの既存の答えを見ました

破損したインデックスを復元する
HD障害によって破損したgitを復元する

どれもうまくいかなかったようです。

4

3 に答える 3

1

それに取り掛かり、それを解決してみましょう。このアプローチはgit reflog、明らかにインデックスが破損していて、reflogが破損したインデックスから読み取ることができないため、機能しない場合にのみ使用してください。

.git/フォルダを開きます

というファイルを見てくださいHEAD
これは、gitが現在あるブランチの名前です。

次に、というファイルを探しますORIG_HEAD
これprobablyには、gitが登録できた最後の適切なコミットのSHAがあります。もしそうなら、出来上がり!

それをコピーし(たとえばX)、ターミナルで次のようにします。
git show X > interim.patch

これにより、最後に成功した変更が標準の差分にコピーされます。

また、このSHA(X)をHEADファイルの内容にコピーします。
これにより、gitは、この変更を、しばらく前に登録していたため、現在の位置と見なすように指示されます。

今までに、を実行するgit branchと、に移動したはず(no branch)です。

これで変更があります。これにより、変更内容がリモートコンテンツで上書きされますgit checkout -f <branch-name>
が、そのパッチにはまだ含まれています。

だから今では、あなたは

  • gitブランチに
  • gitが復元されます

うまくいけgit apply interim.patchば、あなたはあなたの変化を持っていることを意味します。
次に、通常のgitステップを実行します。

  • git add .
  • git commit -am 'Message'

そして、あなたは通常の平和な生活に戻っています。

于 2012-08-10T18:58:30.443 に答える
1

上記の@Arindamの回答を使用してもうまくいきませんでしたが、そのバリエーションはうまくいきました。他の誰かがそれを役立つと思ってくれることを願っています。

この時点で、あなたはGITの危機に瀕しています。おそらくreflogが破損しているため、現在のブランチの状態で新しいブランチをチェックアウトすることはできません。

続行する前に:

  • プロジェクトファイルを別の場所にバックアップします
  • GITがオブジェクトを見つけることができないと言っているSHA1の直前の.git/logs / HEADから最後に成功したSHA1を書き留めます(上記の@Arindamによる)

私のシナリオでは、変更が「失われた」ファイルが最後に編集されたのはいつか(約4時間前)であることがわかっていたため、次を実行すると、最後に成功したコミットから現在までの間に編集されたすべてのプロジェクトファイルがフェッチされます。

$> cd my/project/dir
$> find . -type f -mmin -240 -exec grep -l "$1" {} \; | xargs ls -l
  • これらをどこかにバックアップするので、findコマンドの出力をどこかにテキストファイルに書き留めてください。それらを「元に戻す」場所を知るには、それらがどのディレクトリから来たのかを知る必要があります。

これらのファイルを手動で(たとえば/ tmp / backupに)別の場所にコピーするか、コマンドを拡張して手動で実行します(私は約12個持っていたので、手作業ではそれほど面倒ではありませんでした)

  • .git / HEADを編集し、その内容を上記でメモしたSHAに置き換えます
  • .git / ORIG_HEADを編集して、同じようにします

    $>gitブランチ

GITは「(ブランチなし)」と言うべきです

$> git log

GITは、上記のSHA1のログメッセージを表示する必要があります

次に、新しいブランチを作成します。

$> git checkout -b my_new_branch

次に、すべてのファイルを/ tmp / backupから正しい場所にコピーして、次のコマンドを実行します。

$> git commit -a -m "Some commit"

完了です。これで、「my_new_branch」という新しいブランチに移動し、最後に最も成功したコミットとコミットされて安全な間にすべてのファイルが変更されます。

今、このロットをtarして、どこかにバックアップしてください!

于 2013-06-04T09:58:50.193 に答える
-1

プロジェクトを別のディレクトリに複製します。オリジナルにあったすべての参照があるかどうかを調査します。

于 2012-08-10T23:32:23.567 に答える