2013-05-09 180 views
1

在Mac中我執行cp -a gitrepo1/ gitrepo2/,好像文件和目錄包含.git/都被複制到gitrepo2 /中,我該​​如何恢復gitrepo2?我複製到另一個git倉庫的git倉庫,如何恢復?

+0

當然,通過恢復常規備份中的文件! – Cairnarvon 2013-05-09 04:07:02

+0

悲劇,沒有備份,沒有遠程回購!我在哭。 – nfpyfzyf 2013-05-09 04:08:19

+0

如果你有一個gitrepo2的遙控器,你可以嘗試設置它並從中恢復? – hd1 2013-05-09 04:10:42

回答

6

複製操作不應覆蓋舊對象 - 這就是散列對象名稱的重點;他們獨一無二!也許你只是有一個主分支,所以你已經覆蓋了.git/refs/heads/master分支和.git/HEAD文件。這隻意味着你想要的提交不再是提交的提交鏈的一部分。這意味着你失去的提交是無法訪問的。我們可以發現可達犯這樣的:

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

這應該給你所有不在一個分支的祖先(含)提交列表,或標記提交。此時您可以做各種事情。例如,您可以將所有這些粘合在一起,並將它們發送到gitk以可視化所有這些圖形的瘋狂圖形。如果你只有一個主分支,事情可能會非常簡單。我們只需要完成所有這些'丟失'的提交,按照提交時間排序(如果提交已經通過cherry-pick或rebasing重新排序,作者時間將不太有用),並查看提交結束清單:

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

這將是兩個回購的價值提交的組合,但消息應該有所幫助。一旦你[希望]發現老人頭,得到其散列號和(假設你的主機和要老師傅恢復到它應有的位置):

git reset --hard <hash> 

應該做到這一點!我不是100%確定git fsck --unreachable真的,真的顯示全部提交(this值得掃描,即使他們談論的是對象,而不是提交)。也有git fsck --full,這應該找到沒有父母的提交,但我更不相信它從兩個單獨的,原始源回購找到提交。不過,我認爲這些想法是合理的,所以如果這找不到舊的頭部,那麼我首先會看一個更好的方法來跟蹤對象文件夾中的每個提交以及任何包文件, 。