Git - 意外覆盖远程仓库的整个提交历史

问题描述:

为了在Git和SVN之间创建一个桥梁,允许一个项目的开发人员使用SVN,而另一个项目上的开发人员使用Git,我无意中覆盖了整个git提交历史记录在远程存储库中。以下是导致错误的基本工作流程。Git - 意外覆盖远程仓库的整个提交历史

  1. 克隆远程Git仓库
  2. 随后的一系列命令以导入GIT中回购成SVN的。

    a。我尝试了使用本地SVN存储库作为测试通过*和其他几个位置找到的各种方法。他们中的大多数都因为我反对的Git回购而失败。然而,在http://eikke.com/importing-a-git-tree-into-a-subversion-repository/找到的步骤似乎是成功的,所以那些是我最终使用的。

    b。这只是半成功的。导入到SVN中试图获取所有的git commit历史记录,并将其作为SVN提交日志导入,但在大约2/3的时候失败。最后三分之一是作为一个单独提交被提交到SVN。此外,所有提交日期都被当前日期覆盖,大部分作者被覆盖。鉴于这是SVN回购,而不是实际的Git回购,我并不太在意。

  3. 让某人从SVN签出代码,进行更改并提交。
  4. 使用git svn获取更改
  5. 将更改推送到远程存储库。

最终结果是整个提交历史记录被SVN中现在的内容覆盖。因此,提交日期和作者发生了变化,并且提交历史的最后三分之一丢失。是否有可能恢复?

如果不是,我找到了在进程中间某个地方创建的本地存储库的备份。它似乎具有所有原始提交历史记录。是否有可能以某种方式使用本地备份中的内容覆盖远程存储库上的提交数据?

+2

这是为什么关闭主题? – abcd 2011-05-23 18:51:38

如果您将更改推送到远程,您并未真正覆盖任何内容;毕竟它是版本控制。您应该能够通过将HEAD重置为在执行任何操作之前的位置来恢复遥控器的状态。假设我没有误解你做了什么,你真正需要做的是一样的东西

git checkout <SHA-of-old-head> 
git add -A 
git commit 
git push 

...,你会回到开始的地方,尽管你的螺杆式将保留在远程的历史。如果你不想这样做,你需要直接在遥控器上工作并将HEAD移回到原来的位置。

+0

事实证明,svn将所有Git提交作为单独的SVN提交导入。 * git svn fetch *检索所有这些提交,* git push *将它们作为新提交推送到远程Git存储库。这导致了过多的提交看起来像日志中的原始提交,但实际上是原始文件的重复。这就是为什么我认为历史被覆盖了。感谢您的信息,它使我朝着正确的方向前进。 – Adam 2011-05-23 22:01:41