将复杂的分支层次结构从SVN迁移到Git

将复杂的分支层次结构从SVN迁移到Git,svn,git,Svn,Git,如何将具有数百个分支的大型SVN存储库(几个GBs)迁移到Git存储库?不是为了让他们并肩工作,只是为了摆脱SVN 从我对gitsvn所做的一些实验来看,不清楚如何指定复杂的分支层次结构。特别是当SVN中的分支经常被删除时 下面是我所说的层次结构的一个例子: trunk/ tags/ vendors/boost/ branches/ProjectA/ branches/ProjectA/MajorVersion/ branches/ProjectA/MajorVersion/MinorVersi

如何将具有数百个分支的大型SVN存储库(几个GBs)迁移到Git存储库?不是为了让他们并肩工作,只是为了摆脱SVN

从我对
gitsvn
所做的一些实验来看,不清楚如何指定复杂的分支层次结构。特别是当SVN中的分支经常被删除时

下面是我所说的层次结构的一个例子:

trunk/
tags/
vendors/boost/
branches/ProjectA/
branches/ProjectA/MajorVersion/
branches/ProjectA/MajorVersion/MinorVersion/
branches/Experimental1/
branches/RecycleBin/OldDiscardedBranch
一个简单的正则表达式或通配符不能捕获所有分支的正确位置


有没有办法将所有这些分支位置信息提供给Git?当git svn尝试迁移属于已删除分支的修订版时,它会做什么?

我一直在考虑用不同的repo做类似的事情。我思考和游戏的最终结果是,你需要做几件事:

  • 使用
    git filter branch
    从一些项目重写到另一个项目。例如,使用
    git filter branch
    将子目录中的所有内容重命名为父目录。在我的例子中,我在主干下有多个模块,我使用过滤器分支将一个目录中的所有内容移动到顶部
  • 对每个分支也执行此操作,但同时删除不属于特定项目的任何分支
这样,最终您将有多个
git
repo,每个repo只包含一个项目(应该是这样的)

如果分支/标记目录很复杂,那么
git svn clone
命令将允许您使用逗号指定多个标记和分支目录(如果我记得的话)


另外,在提取完所有内容后运行
git-gc--aggressive
,将回购规模缩小一点。

你能说得具体一点吗?那么git svn克隆--stdlayout呢http://url gitrepo/不起作用?不,它不起作用,因为它不知道如何识别svn存储库中的哪些路径实际上是分支。它只是假设一个标准的分支层次结构并不代表我们的特定设置。我不确定我是否理解。这是你建议我在从svn转换到git后做的事情吗?此外,我们不能采用每回购一个项目的方法。我们有太多的项目共享太多的公共库(数百个)。是的,将svn repo转换为单个git repo,然后制作它的多个副本,并将每个副本筛选到您想要的模块。如果你不想,你不必有多个git回购协议,但通常这样做更容易、更干净。如果您有影响多个项目的多个库,则不必阻止您将它们放在单独的模块中。您甚至可以让父模块包含“子模块”和所有需要的部分。如果这通常是一个完整的项目,并且没有多个部分,那么不要拆分它。如果是这样的话,那么您可能仍然需要在分支中具有主要次要版本的奇怪分支情况下使用filter branch。我想这需要做一些工作。我仍然不明白我应该如何将回购转换成Git?如果我只使用git svn clone,那么我就只剩下一个存储库,其中每个分支实际上都是一个目录,这意味着一个大型损坏的repo只有几百GB,没有正确的分支历史记录。简而言之,我如何教svn git什么是分支,什么不是分支?这就是您需要在
git svn init
(或
git svn clone
)中小心使用分支的地方。例如,有多个分支:
——分支分支/ProjectA/MajorVersion/MinorVersion——分支/ProjectA/Experiment1
。。。您可能希望先执行一些
svn mv
s,以使事情更简单。在运行
git svn
之前,首先重命名一些基于深度的分支。