VMを強制的にシャットダウンした後、このgitメッセージが表示されました。これにより、明らかにgitインデックスが破損しました。
Git: Failed to read object abcdef.... Invalid argument
私はこれらの既存の答えを見ました
破損したインデックスを復元する
HD障害によって破損したgitを復元する
どれもうまくいかなかったようです。
VMを強制的にシャットダウンした後、このgitメッセージが表示されました。これにより、明らかにgitインデックスが破損しました。
Git: Failed to read object abcdef.... Invalid argument
私はこれらの既存の答えを見ました
破損したインデックスを復元する
HD障害によって破損したgitを復元する
どれもうまくいかなかったようです。
それに取り掛かり、それを解決してみましょう。このアプローチは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 apply interim.patch
ば、あなたはあなたの変化を持っていることを意味します。
次に、通常のgitステップを実行します。
git add .
git commit -am 'Message'
そして、あなたは通常の平和な生活に戻っています。
上記の@Arindamの回答を使用してもうまくいきませんでしたが、そのバリエーションはうまくいきました。他の誰かがそれを役立つと思ってくれることを願っています。
この時点で、あなたはGITの危機に瀕しています。おそらくreflogが破損しているため、現在のブランチの状態で新しいブランチをチェックアウトすることはできません。
続行する前に:
私のシナリオでは、変更が「失われた」ファイルが最後に編集されたのはいつか(約4時間前)であることがわかっていたため、次を実行すると、最後に成功したコミットから現在までの間に編集されたすべてのプロジェクトファイルがフェッチされます。
$> cd my/project/dir
$> find . -type f -mmin -240 -exec grep -l "$1" {} \; | xargs ls -l
これらのファイルを手動で(たとえば/ tmp / backupに)別の場所にコピーするか、コマンドを拡張して手動で実行します(私は約12個持っていたので、手作業ではそれほど面倒ではありませんでした)
.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して、どこかにバックアップしてください!
プロジェクトを別のディレクトリに複製します。オリジナルにあったすべての参照があるかどうかを調査します。