在嫁接的Git历史中引入合并

时间:2016-08-24 11:11:55

标签: git svn merge git-filter-branch .git-info-grafts

我正在将SVN存储库导入Git。 SVN存储库的结构有点乱,所以我不得不将它转换为三个独立的Git存储库,然后将它们合并在一起。

如果这是一个简单的项目,包含三个部分到一个历史记录,那么我可能只是将它们重新放在另一个上面,例如:

cd part3
git remote add -f part1 url_to_part1
git remote add -f part2 url_to_part2
git rebase part2/master
git rebase part1/master

但是,上面示例中的part3包含数十个标记和三个分支。如果第1部分和第2部分已完全合并到SVN中的master(井,主干)中,那么我会像this那样将分支正确地移植到历史中。这样做的好处是所有标签都可以保留在原位,与底板不同。

但其中一个分支有一个孤立的提交,我们现在想要合并到历史记录中。现在,如果我尝试使用移植修复历史记录,则孤立提交的更改将丢失。在下面的示例中,合并X到C发生在SVN中,因此我可以创建与移植的链接。但我想在C和D之间合并孤立的提交O,同时在提交E,G等上保留标记。

A-B-C-[ ]-D-E-F-G-H-...  
 \ /  /
  X--O

有没有办法可以使用像grafts文件这样的东西来指定图形结构,但实际上是否可以执行隐含的合并?或者是否有我应该在这里使用的filter-branch命令?

1 个答案:

答案 0 :(得分:1)

git-svn 是用于一次性转换存储库的正确工具。如果您想将Git用作现有SVN服务器的前端,这是一个很棒的工具,但对于一次性转换,您应该使用git-svn,但svn2git是更适合这种用例。

有一些称为svn2git的简单工具,最好的工具是来自https://github.com/svn-all-fast-export/svn2git的KDE工具。我强烈建议您使用svn2git工具。这是我所知道的最好的,它可以非常灵活地使用它的规则文件。

如果您不是100%关于存储库的历史记录,那么http://blog.hartwork.org/?p=763中的svneverever是一个很好的工具,用于在将SVN存储库迁移到Git时调查其历史记录。

您将能够以一种方式编写规则文件,您可以将整个SVN存储库转换为适当的Git存储库。