追溯svn导入git

追溯svn导入git,git,svn,history,Git,Svn,History,我的问题是: 我使用Subversion有一段时间了,直到我切换到Git。又过了一段时间 从Subversion到Git并没有导入历史。这是一次严格的签出,先删除.svn dirs,然后是git init。这不是明智之举 现在,数千次git提交之后,我找到了在第一次git提交时所做的Subversion repo的备份。啊哈 我想将git回购回滚到第0天,正确导入svn回购,然后重新应用所有git更改,从而纠正第一次没有做的事情 有人尝试过这个吗?我该怎么做呢?这听起来像是所有回扣之母。我从未尝

我的问题是:

  • 我使用Subversion有一段时间了,直到我切换到Git。又过了一段时间
  • 从Subversion到Git并没有导入历史。这是一次严格的签出,先删除.svn dirs,然后是git init。这不是明智之举
  • 现在,数千次git提交之后,我找到了在第一次git提交时所做的Subversion repo的备份。啊哈 我想将git回购回滚到第0天,正确导入svn回购,然后重新应用所有git更改,从而纠正第一次没有做的事情


    有人尝试过这个吗?我该怎么做呢?这听起来像是所有回扣之母。

    我从未尝试过你想要的,但我正在用CVS做类似的事情

    基本上,我建议:

  • 使用svn中的历史记录创建一个新的git存储库
  • 在这个新的存储库中,
    git fetch
    git存储库中的所有内容(没有共同的提交)
  • 然后,
    git-branch-remote/branch-last
    git-rebase-on-svn-last-remote/branch-first-branch-last
    ,其中
    remote/branch-first
    是导入的git存储库的第一次提交,等等

  • 如果你有更多的分支,事情就更复杂了。我想重复第三步也许可以,但你最好自己试试。如果您的git历史记录中有合并,您可能需要
    git-rebase-i-p…
    。记住,git的优点是你基本上不会把任何事情搞砸(特别是如果你在一个单独的存储库中工作的话)。

    听起来像是git嫁接者的工作。这方面的文档有点粗略,但基本上您要做的是:

  • 在回购协议中获取svn的git svn副本。最简单的方法是在中git svn clone,然后在现有存储库中获取svn克隆
  • 找出哪个基本提交应该遵循svn提交。因此,您可能在某个地方有一个git根(“上一个SVN版本”),它应该遵循上一个实际的SVN版本。这是您刚刚获取的git svn克隆的头部
  • 创建一个文件.git/info/grafts并将两个sha放在一行中。第一个是第一个git提交,然后是一个空格,然后是最后一个svn提交。这告诉git git提交不是无父的,但实际上最后一次svn提交是父的
  • 现在可以使用gitk/gitx/检查这两个存储库是否连接
  • 要使更改永久化,请运行git filter branch。您可能需要先阅读它的主页

  • 当然,您也可以对所有分支执行步骤3。jpalecek方法的问题是,重新基础将使您的历史变得平坦,因此,如果您有任何合并,重新基础将丢失它们。“过滤器分支”方法保持您的历史完整。

    这正是我为memcached所做的:写得不错,彼得。您已使git移植变得简单+1汉克斯·彼特,+1来自我。使用两个图像的相同过程也可以在两个点上找到——使用--tag name filter cat运行git filter branch以转换标记,并且,在完成时不要忘记注释掉/删除.git/info/grafts文件,否则似乎无法推送到远程存储库进行更新。