追溯svn导入git

时间:2009-01-19 22:46:45

标签: git svn history

这是我的问题:

  1. 我使用Subversion一段时间,直到我切换到Git。还有一段时间过去了。
  2. 从Subversion到Git没有导入历史记录。这是严格的结账,删除.svn dirs,然后是git init。不是一个聪明的举动。
  3. 现在,数以千计的git提交后,我找到了在第一次git提交发生时制作的Subversion repo的备份。啊哈!
  4. 我想将git repo回滚到第0天,正确导入svn repo,然后重新应用所有git更改,从而纠正第一次没有做的事情。

    有没人试过这个?我该怎么做呢?这听起来像是所有篮板的母亲。

2 个答案:

答案 0 :(得分:15)

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

  1. 在你的回购中获取svn的git-svn副本。最简单的方法是使用git svn clone,然后在现有存储库中获取svn clone
  2. 找出应该遵循svn提交的基本提交。所以你可能有一个git root(“上一个SVN版本”)应该遵循上一个实际的SVN版本。这是你刚刚获取的git-svn克隆的负责人
  3. 创建一个.git / info / grafts文件,然后将两个sha放在一行上。第一个是第一个git提交,然后是空格,然后是最后一个svn提交。这告诉git git commit不是无父对象,但事实上最后一个svn提交是父对象。
  4. 您现在可以查看gitk / gitx /两个存储库连接的内容
  5. 要使更改成为永久更改,请运行git filter-branch。您可能希望首先阅读其联机帮助页。
  6. 当然,您也可以为所有分支机构执行第3步。 jpalecek方法的问题在于,rebase会使你的历史变平,所以如果你有任何合并,那么rebase就会失去它们。过滤器分支方法可以保持您的历史记录不变。

答案 1 :(得分:1)

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

基本上,我建议:

  1. 使用svn
  2. 中的历史记录创建一个新的git存储库
  3. 在这个新的存储库中,git fetch来自git存储库的所有东西(不会有共同的提交)
  4. 然后,git branch remote/branch branch-lastgit rebase --onto svn-last remote/branch-first branch-last,其中remote/branch-first是您导入的git存储库的第一次提交,等等。
  5. 如果你有更多的分支,事情会更复杂。我认为重复第3步可能会这样做,但你最好自己尝试一下。如果您在git历史记录中有合并,则可能需要git rebase -i -p ...。请记住,git的优点是你基本上不能搞砸任何东西(特别是如果你在一个单独的存储库中工作)。