2013-05-09 188 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,这应该找到没有父母的提交,但我更不相信它从两个单独的,原始源回购找到提交。不过,我认为这些想法是合理的,所以如果这找不到旧的头部,那么我首先会看一个更好的方法来跟踪对象文件夹中的每个提交以及任何包文件, 。