代码之家  ›  专栏  ›  技术社区  ›  Paul Beckingham

回溯svn导入git

  •  10
  • Paul Beckingham  · 技术社区  · 16 年前

    以下是我的问题:

    1. 我使用Subversion有一段时间,直到我切换到Git。又过了一段时间。
    2. 并没有将历史记录从Subversion导入Git。这是一个严格的签出,删除.svn目录,然后进行git初始化。这不是明智之举。
    3. 现在,经过数千次git提交,我找到了第一次git提交时创建的Subversion仓库的备份。啊哈!

    我想将git repo回滚到第0天,正确导入svn repo,然后重新应用所有git更改,从而纠正第一次没有做的事情。

    有人尝试过吗?我该怎么做?这听起来像是所有基础的母亲。

    2 回复  |  直到 12 年前
        1
  •  15
  •   Pieter    16 年前

    听起来像是git grafts的工作。这方面的文档有点粗略,但基本上你想做的是:

    1. 在仓库中获取svn的git svn副本。最简单的方法是git svn clone,然后在现有的存储库中获取svn克隆
    2. 找出svn提交之后应该是哪个基础提交。所以你可能在某个地方有一个git根(“Last SVN version”),它应该跟在最后一个实际的SVN版本之后。这是你刚刚获取的git svn clone的头部
    3. 创建一个.git/info/trops文件,并将两个sha放在一行中。第一个是第一个git commit,然后是一个空格,最后一个svn commit。这条消息告诉git,git提交不是无父级的,但实际上有最后一个svn提交作为父级。
    4. 现在,您可以使用gitk/gitx/检查这两个存储库是否连接
    5. 要使更改永久化,请运行git filter分支。你可能想先读一下它的手册页。

    当然,您也可以对所有分支执行步骤3。jpalecek方法的问题是,重基会使您的历史变平,因此如果您有任何合并,重基将丢失它们。过滤器分支方法可以保持您的历史记录不变。

        2
  •  1
  •   jpalecek    16 年前

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

    基本上,我建议:

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

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