我正在计划一个svn来git迁移一堆存储库。其中两个处于特定状态。
一个项目已经在一个svn回购中开发。由于各种限制,项目在某些时候已经分叉。 fork是通过复制svn repo制作的。在那之后,这两个项目分别演变。除了主干之外,任何一个仓库中都不存在分支或标签。
已为原始项目开发了一项重要功能,需要将其移植到分支。在当前情况下,可以通过从各种修订版创建补丁并将其应用于分叉项目来完成。这在当前情况下具有短期简单的优点,但从长远来看会产生许多笨拙的后果。
我们可以有两个不同的git repos并通过pull请求进行跨叉移植,但这可能缺乏可用性(我们不使用github)。此外,由于采用模块化设计重构,我们可能希望将fork重新集成到父项目中。另一种方法是将两个svn存储库合并为一个git存储库作为不同的分支,并从那里管理后续合并(具有它提供的所有优点)。
理想情况下,我想重新创建项目的真实历史,即有一个git repo:
一个可能有用的有趣事实,以下命令为公共提交生成相同的SHA1:
git svn clone -s -A svn.authors --no-metadata http://subversion.foo.local/repo/path git_migration
我不关心--no-metadata
因为它是单向迁移。
如果可能的话,我怎么能达到这样的结果呢?
答案 0 :(得分:2)
通常可以使用git Graft Points
将历史记录连接到单个根目录我推荐你
https://git.wiki.kernel.org/index.php/GraftPoint
简单来说,你只需告诉 git哪些修订版共享某个父修订版(如果你愿意,可以使用魔术'合并'结果)。一旦你开心,你可以使用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回购的常用历史记录。