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

nfp*_*zyf 1 git

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

Gar*_*ler 6

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

git fsck --unreachable | grep commits | cut -d' ' -3
Run Code Online (Sandbox Code Playgroud)

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

git fsck --unreachable | cut -d' ' -f3 | while read c; do git log -1 --format='%ct %H %s' $c; done | sort
Run Code Online (Sandbox Code Playgroud)

这将是两个repos'值得提交的混合,但消息应该有所帮助.一旦你[希望]找到旧头,得到它的哈希值和(假设你是主人,并希望将旧主人恢复到正确的位置):

git reset --hard <hash>
Run Code Online (Sandbox Code Playgroud)

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