1

cp -a gitrepo1/ gitrepo2/Mac で実行すると、ファイルとディレクトリ インクルードがgitrepo2 .git// にコピーされているようですが、gitrepo2 を復元するにはどうすればよいですか?

4

1 に答える 1

6

コピー アクションは古いオブジェクトを上書きすべきではありません。これがハッシュ化されたオブジェクト名のポイントです。彼らはユニークです!マスター ブランチを作成したばかりで、.git/refs/heads/masterブランチと.git/HEADファイルを上書きした可能性があります。これは、必要なコミットが、参照先の一連のコミットの一部ではなくなったことを意味します。つまり、失われたコミットには到達できません。次のようにして、到達不能なコミットを見つけることができます。

git fsck --unreachable | grep commits | cut -d' ' -3

これにより、ブランチの祖先 (包括的) にないすべてのコミット、またはタグ付けされたコミットのリストが表示されます。この時点で、さまざまなことができます。たとえば、これらすべてを結合して gitk に送信し、それらすべてのクレイジーなグラフを視覚化できます。ただし、マスター ブランチが 1 つしかない場合は、作業は非常に簡単です。これらの「失われた」コミットをすべて取得し、それらをコミット時間でソートし (コミットがチェリーピックまたはリベースによって並べ替えられている場合、作成者の時間はあまり役に立ちません)、最後にコミットを確認する必要があります。リスト:

git fsck --unreachable | cut -d' ' -f3 | while read c; do git log -1 --format='%ct %H %s' $c; done | sort

これは、2 つのリポジトリのコミットに相当するものを組み合わせたものになりますが、メッセージが役立つはずです。[うまくいけば]古いヘッドを見つけたら、そのハッシュ番号を取得し、(マスターにいて、古いマスターを正しい場所に復元したいと仮定します):

git reset --hard <hash>

それはそれ行う必要があります!git fsck --unreachable本当に、本当にすべてのコミットが表示されるかどうかは 100% 確信が持てません(コミットではなくオブジェクトについて話しているにもかかわらず、これはスキャンする価値があります)。親のないコミットを見つけることになっているもありgit fsck --fullますが、2 つの別々の元のソース リポジトリからコミットを見つけることについては、さらに信頼できません。ただし、アイデアは健全だと思うので、これで古い頭が見つからない場合は、オブジェクトフォルダーとパックファイル内のすべてのコミットを追跡するより良い方法を最初に検討します.

于 2013-05-09T05:02:46.293 に答える