从SVN迁移一个复杂的分支层级到Git

3

如何将几 GB 的大型 SVN 代码库与数百个分支迁移到 Git 代码库?不需要让它们并行运行,只需要找到一种摆脱 SVN 的方法。

通过一些我使用 git svn 做的实验,我发现很难指定复杂的分支层级结构,特别是当 SVN 中的分支经常被删除时...

这里是我所说的分支层级结构的一个示例:

trunk/
tags/
vendors/boost/
branches/ProjectA/
branches/ProjectA/MajorVersion/
branches/ProjectA/MajorVersion/MinorVersion/
branches/Experimental1/
branches/RecycleBin/OldDiscardedBranch

重点在于简单的正则表达式或通配符无法捕获所有分支的正确位置。

有没有一种方法将所有这些分支位置信息提供给Git?当git-svn尝试迁移属于已删除分支的修订版本时会发生什么?


1
你能具体说明一下吗?git svn clone --stdlayout http://url gitrepo/有什么问题? - sehe
不,它不能识别svn仓库中哪些路径实际上是分支,因此它无法做到这一点。它只是假设一个标准的分支层次结构,而这并不代表我们特定的设置。 - Assaf Lavie
1个回答

2

我一直在考虑使用不同的repo做类似的事情。我的想法和实践的最终结果是你需要做以下几件事:

  • 使用 git filter-branch 命令将某些项目从一个repo重命名为另一个repo。例如,使用 git filter-branch 命令将子目录中的所有内容重命名为父目录中的内容。在我的情况下,我有多个模块在trunk下,并且我正在使用filter-branch命令将一个目录中的所有内容移动到顶层目录。
  • 对每个分支都要这样操作,并删除与特定项目无关的任何分支。

这样最终你会有多个git repos,每个repo只包含一个项目 (应该是这样)。

如果分支/标签目录比较复杂,可以使用 git svn clone 命令并使用逗号指定多个标签和分支目录(如果我没记错的话)。

此外,在提取所有内容后运行 git gc --aggressive 命令,以使repo大小缩小一点。


我不确定我是否理解了。这是您建议我在从svn转换到git之后做的事情吗?此外,我们无法采用每个存储库一个项目的方法。我们有太多共享太多公共库(数百个)的项目。 - Assaf Lavie
是的,将svn仓库转换为单个git仓库,然后制作多个副本,并将每个副本过滤到所需的模块。如果您不想要多个git仓库,也可以不这样做,但通常这样做更容易更清晰。如果您有多个影响多个项目的库,那么这并不会阻止您将它们放在单独的模块中。您甚至可以使用父模块包含具有所有所需部件的“子模块”。 - Wes Hardaker
如果这通常是一个完整的项目,没有多个部分,请不要拆分它。如果是这种情况,则仍然需要在具有分支内主次版本的奇怪分支情况下使用filter-branch。我认为需要一些工作。 - Wes Hardaker
这就是你需要在 git svn init(或 git svn clone)中小心使用 --branches 的地方。例如,对于多个分支:--branches branches/ProjectA/MajorVersion/MinorVersion --branches branches/ProjectA/Experiment1 ... 如果这样做会更容易,你可能需要先执行一些 svn mv 操作。也就是说,在运行 git svn 之前,先重命名一些基于深度的分支。 - Wes Hardaker
我正在尝试您的建议,@Wes,似乎--branches将其参数视为分支存在的位置,而不是分支路径。 因此,据我所知,我无法通过执行“-b some / branch-b some / other / branch ...”来指定分支列表 - 我必须先将所有分支重新排列到平面容器中(包含单个级别的分支的目录),然后对每个这样的容器进行-b操作。 - Assaf Lavie
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接