我将git repo复制到另一个git仓库,如何恢复?

时间:2013-05-09 04:01:44

标签: git

我在Mac上执行cp -a gitrepo1/ gitrepo2/,似乎文件和目录包括.git/被复制到gitrepo2 /,我该如何恢复gitrepo2?

1 个答案:

答案 0 :(得分:6)

复制动作不应该覆盖旧对象 - 这是散列对象名称的重点;他们独一无二!也许你只有一个主分支,所以你已经覆盖了.git/refs/heads/master分支和你的.git/HEAD文件。这只意味着您想要的提交不再是提交的提交链的一部分。这意味着您丢失的提交无法访问。我们可以找到无法访问的提交:

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

这应该为您提供一个列表,其中列出了分支或标记提交的祖先(包括)中的所有提交。此时你可以做各种事情。例如,您可以将所有这些粘合在一起并将它们发送到gitk以可视化所有这些的疯狂图形。但是,如果你只有一个主分支,事情就会变得非常简单。我们只需要把所有这些&#39;丢失&#39;提交,按 commit 时间对它们进行排序(如果提交已通过cherry-pick或rebasing重新排序,则作者时间将不太有用),并查看列表末尾的提交:< / p>

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

这将是两个回购&#39;值得提交,但消息应该有所帮助。一旦你[希望]找到旧的头,得到它的哈希数和(假设你是主人,并希望将旧主人恢复到正确的位置):

git reset --hard <hash>

应该做到这一点!我并非100%确定git fsck --unreachable确实显示所有提交(this值得扫描,即使他们正在讨论对象,不承诺)。还有git fsck --full,它应该发现没有父母的提交,但我更不信任它从两个独立的原始源回购中查找提交。我认为这些想法是合理的,所以如果这找不到旧的头部,那么我首先要看一个更好的方法来跟踪对象文件夹和任何包中的每一个提交文件(S)。

相关问题