2009-01-19 69 views
9

这里是我的问题:追溯SVN导入Git

  1. 我用颠覆了一段时间,直到我换到Git的。经过了一段时间。
  2. 没有从Subversion到Git的历史导入。这是一个严格的结帐,删除.svn dirs,然后git init。不是一个明智的举动。
  3. 现在,成千上万的git提交后,我找到了在第一次git提交时发生的Subversion repo的备份。啊哈!

我想将git回购回滚到第0天,正确导入svn回购,然后重新应用所有git更改,从而更正第一次未完成的操作。

有没有人尝试过?我会如何去做这件事?这听起来像是所有基调的母亲。

回答

14

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

  1. 获得你的回购协议中的svn的git-svn副本。最简单的方法是git svn clone in,然后在你现有的仓库中获取svn克隆
  2. 找出哪个基提交应该遵循svn提交。所以你可能有一个git root的地方(“Last SVN version”),它应该遵循最后一个实际的SVN版本。这是你刚刚提取的git-svn clone的头文件
  3. 创建一个文件.git/info/grafts,并将两个sha放在一行上。第一个是第一个git提交,然后是空间,然后是最后的svn提交。这告诉git git提交不是无父母的,但事实上最后的svn提交作为父母。
  4. 你现在可以检查与gitk/gitx /无论这两个存储库连接
  5. 要使更改永久,运行git filter-branch。您可能首先要阅读其手册页。

你当然也可以为你所有的分支做第3步。 jpalecek的方法存在的问题是,rebase会使你的历史变平,所以如果你有任何合并,rebase就会失去它们。过滤器分支方法可以保持您的历史记录不变。

+1

这正是我为memcached所做的:http://groups.google.com/group/memcached/browse_thread/thread/a7b153bc087244b1/4023dbe7168ea5fa – Dustin 2009-01-20 00:17:05

1

我从来没有尝试过你想要的,但我正在做类似于CVS的事情。

基本上,我建议:

  1. 创建从SVN
  2. 历史在这个新的仓库一个新的git仓库,git fetch一切从Git仓库(以后还有没有共同提交)
  3. 然后,git branch remote/branch branch-lastgit rebase --onto svn-last remote/branch-first branch-last,其中remote/branch-first是第一个提交您的进口git仓库中,等

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