将具有共同历史记录的两个svn repos迁移到git

时间:2011-08-23 08:56:49

标签: git svn migration

我正在计划一个svn来git迁移一堆存储库。其中两个处于特定状态。

一个项目已经在一个svn回购中开发。由于各种限制,项目在某些时候已经分叉。 fork是通过复制svn repo制作的。在那之后,这两个项目分别演变。除了主干之外,任何一个仓库中都不存在分支或标签。

已为原始项目开发了一项重要功能,需要将其移植到分支。在当前情况下,可以通过从各种修订版创建补丁并将其应用于分叉项目来完成。这在当前情况下具有短期简单的优点,但从长远来看会产生许多笨拙的后果。

我们可以有两个不同的git repos并通过pull请求进行跨叉移植,但这可能缺乏可用性(我们不使用github)。此外,由于采用模块化设计重构,我们可能希望将fork重新集成到父项目中。另一种方法是将两个svn存储库合并为一个git存储库作为不同的分支,并从那里管理后续合并(具有它提供的所有优点)。

理想情况下,我想重新创建项目的真实历史,即有一个git repo:

  • 由提交到fork的单个分支
  • 由parent和fork组成的两个不同的分支提交到HEADs

一个可能有用的有趣事实,以下命令为公共提交生成相同的SHA1:

git svn clone -s -A svn.authors --no-metadata http://subversion.foo.local/repo/path git_migration

我不关心--no-metadata因为它是单向迁移。

如果可能的话,我怎么能达到这样的结果呢?

2 个答案:

答案 0 :(得分:2)

通常可以使用git Graft Points

将历史记录连接到单个根目录

我推荐你

https://git.wiki.kernel.org/index.php/GraftPoint

简单来说,你只需告诉 git哪些修订版共享某个父修订版(如果你愿意,可以使用魔术'合并'结果)。一旦你开心,你可以使用git filter-branch

将它投入石头

来自man git-filter-branch

的示例
echo "$commit-id $graft-id" >> .git/info/grafts
git filter-branch $graft-id..HEAD

答案 1 :(得分:2)

由于你有办法克隆具有相同哈希值的常见提交的SVN repos,这应该可以。

git svn clone -s -A svn.authors --no-metadata http://subversion.foo.local/repo1/path git_migration
git svn clone -s -A svn.authors --no-metadata http://subversion.foo.local/repo2/path git_migration-2
cd git_migration
git branch repo1 # Branch for first repo
git reset --hard <highest_common_hash> # To have only common history on master
git checkout -b repo2 # Branch for second repo
git pull ../git_migration-2 master

现在,您必须在master和2个分支中拥有不同SVN回购的常用历史记录。