将git-svn分支迁移到git分支

时间:2013-04-28 16:42:22

标签: git git-svn

我的项目(相当大,大约200万行代码和数万次提交)目前正在从git-svn切换到git。许多用户拥有git-svn分支,其历史记录在新的纯git存储库中很有用。基本情况就是这样

旧的git-svn回购:

A-B-C-D-E-F (master)

我在这个存储库上有一个分支,它已多次合并master,例如:

    G-H---I-J-K (feature)
   /     /
A-B-C-D-E-F (master)

我想将此分支移动到新的pure-git存储库并维护我的历史记录。为了使事情变得更复杂,pure-git存储库和svn存储库的目录结构略有不同。具体来说,此存储库中的基本目录结构有两个目录,例如:

foo/ bar/

在新的git存储库中,bar/已移至新存储库。

如何将此分支移动到新存储库并在pure-git repo中以类似的方式结束?

    G'-H'----I'-J'-K' (feature)
    /       /
A'-B'-C'-D'-E'-F' (master)

我认为以下内容可行:

来自git-svn repo上的功能分支:

git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch bar" B..HEAD

哪个应该删除对foo目录的所有修改,这在新的repo中是不存在的。 然后,将git-svn repo添加为纯git repo的远程,并从pure-git repo执行此操作:

git checkout -b B' feature
git rebase --preserve-merges --onto feature remotes/old_git_svn_repo/master remotes/old_git_svn_repo/feature

不幸的是,这似乎不起作用。我仍然需要手动解决我已在功能分支中解决的所有合并冲突。有办法做我想做的事吗?

1 个答案:

答案 0 :(得分:1)

正如您所做的那样,您应该运行的第一件事是filter-branch --index-filter来修复分支的树结构。但现在你需要修复父关系。根据已合并的数量,有两种选择:

  • 手动执行 :查看git help replacegit replace允许您将一个提交替换为另一个提交。为每个合并库执行此操作。例如:

    git replace B B'
    git replace E E'
    

    请注意,如果您未在filter-branch上运行master..featureB可能已经拥有不同的SHA。

    完成此步骤后,您需要再次运行filter-branch以使替换永久化。我建议先做替换,然后再运行--index-filter。通过这种方式,您可以一次性完成所有操作。

  • 使用 - parent-filter 执行此操作。查看--parent-filter的{​​{1}}参数。它将允许您指定脚本以重写父关系。该脚本可以使用应记录在每个移植的提交消息中的filter-branch来查找新git-svn-id:中的匹配提交。