私はちょうどこれを経験しました-Gitリポジトリに書き込み中にマシンがクラッシュし、破損しました。以下のように修正しました。
まず、リモートリポジトリにプッシュしなかったコミットの数を確認することから始めました。
gitk &
このツールを使用しない場合は非常に便利です。私の知る限り、すべてのオペレーティングシステムで使用できます。これは、私のリモコンに2つのコミットがないことを示しています。そのため、最新のリモートコミットを示すラベルをクリックしました(通常、これは/remotes/origin/master
)をハッシュを取得しました(ハッシュは40文字ですが、簡潔にするために、ここでは10を使用しています-これは通常はとにかく動作します)。
ここにあります:
14c0fcc9b3
次に、次のコミット(つまり、リモートにない最初のコミット)をクリックして、そこにハッシュを取得します。
04d44c3298
次に、これらの両方を使用して、このコミットのパッチを作成します。
git diff 14c0fcc9b3 04d44c3298 > 1.patch
次に、他の欠落しているコミットについても同様に行いました。つまり、以前のコミットのハッシュとコミット自体のハッシュを使用しました。
git diff 04d44c3298 fc1d4b0df7 > 2.patch
次に、新しいディレクトリに移動し、リモートからリポジトリを複製しました。
git clone git@github.com:username/repo.git
次に、パッチファイルを新しいフォルダに移動し、それらを適用して、正確なコミットメッセージでコミットしました(これらgit log
はgitk
ウィンドウまたはウィンドウから貼り付けることができます)。
patch -p1 < 1.patch
git commit
patch -p1 < 2.patch
git commit
これは私のために物事を復元しました(そして、多くのコミットのためにそれを行うより速い方法がおそらくあることに注意してください)。しかし、破損したリポジトリのツリーを修復できるかどうかを知りたいと思っていました。上記のように利用可能な修復されたレポで、壊れたフォルダーで次のコマンドを実行します。
git fsck
あなたはこのようなものを得るでしょう:
error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
修復するには、壊れたフォルダで次のようにします。
rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
つまり、破損したファイルを削除して、適切なファイルに置き換えます。これを数回行う必要がある場合があります。最後に、実行できるポイントがありますfsck
エラーなし。レポートにはおそらく「ダングリングコミット」行と「ダングリングブロブ」行があります。これらは、このフォルダーのリベースと修正の結果であり、問題ありません。ガベージコレクターは、やがてそれらを削除します。
したがって、(少なくとも私の場合は)ツリーが破損しても、プッシュされていないコミットが失われるわけではありません。