关于合并多个 svn repos 的说明

Posted

技术标签:

【中文标题】关于合并多个 svn repos 的说明【英文标题】:Clarification on consolidating multiple svn repos 【发布时间】:2014-01-21 12:03:43 【问题描述】:

我们在特定物理位置/mnt/data1/repos 有多个 SVN 存储库

并且回购的结构如下

repos
     |
     App1
         |
         trunk
              |
              module1
              |
              module2
         |
         branches
     |
     App2
         |
         trunk
              |
              module1
              |
              module2
         |
         branches
     |
     App3
         |
         trunk
              |
              module1
              |
              module2
         |
         branches

我们正在尝试将多个存储库合并到单个存储库,如下所示,位于不同的路径 /mnt/data2/repo

     repo
     |
     trunk
         |
         App1
            |
            module1
            |
            module2
         |
         App2
            |
            module1
            |
            module2
         |
         App3
            |
            module1
            |
            module2

我在/mnt/data2/repo使用svnadmin 创建了一个repo

创建目录/mnt/data2/repo/trunk/App1/mnt/data2/repo/trunk/App2/mnt/data2/repo/trunk/App3使用svn mkdir

然后我尝试做 app1 /mnt/data1/repos/App1/svn dump,使用 svndumpfilterinclude trunk 过滤它,并将 svn import 做为 /mnt/data2/repo/trunk/App1。它失败了,因为 /mnt/data2/repo/trunk/App1 不是 repo 的根。

请告诉我执行此合并的最佳方式。 重要的是我们应该保留所有 repos 的修订历史记录。

编辑:

我执行了以下步骤。

svnadmin dump --quiet /mnt/data1/repos/App1 > App1.dmp
svndumpfilter include --targets /tmp/list.txt < App1.dmp > App1Trunk.dmp
svnadmin create /mnt/data2/repo/
svn mkdir --parents svn://<IP>:<PORT>/trunk/App1 -m "Creating MC directory"
svnadmin load  --quiet --parent-dir trunk/App1 /mnt/data2/repo < App1Trunk.dmp

当我尝试加载转储时,我发现它仍在创建trunk/App1/trunk/module1trunk/App1/trunk/module2 等。帮助我将数据加载到trunk/App1/moudle*

【问题讨论】:

Moving SVN repositories data with history as subfolders into another repository的可能重复 感谢您指出我的答案。但是当我尝试导入过滤后的转储时,它失败了。让我试试svnadmin import--parent-dir 并更新 没有svnadmin import 命令。导入过滤后的转储时遇到什么错误? 正如您在另一个线程中的回答中提到的,我创建了转储并使用 svndumpfilter 过滤。然后我使用cd /data/repo svnadmin created newrepo 创建了一个新的仓库。现在,当我从转储文件 svnadmin load --parent-dir /trunk /data/repo/newrepo 加载数据并执行 svn list file:///data/repo/newrepo 时,什么都没有显示... @bahrep 我执行了您建议的步骤,但它也将原始存储库路径添加到新存储库。我已将问题编辑得更清楚。 【参考方案1】:

最简单的方法是使用svn mv 来移动东西:

$ svn mv --parents $URL/repos/App1/trunk/module1 $URL/repos/trunk/App1/module1

这会将您的存储库移至新结构,并且您仍将拥有自己的历史记录。在移动整个项目时,您必须与存储库的用户进行协调。确保用户知道发生了什么。事实上,协调通常是这些动作的最大问题。

svnadmin dumpsvnadmin load 的问题是你可以移动的东西是有限的。即使您将旧项目的目录结构移动到新节点,也会保留它们。由于 Subversion 存储库是一个巨大的项目,并且您可以正式提交涉及多个分支、主干和项目的更改,因此 Subversion 坚持保持其结构。您也许可以将某些内容移动到新的根节点,但除此之外您无法真正编辑结构。

【讨论】:

谢谢。通过 svnadmin dumpsvndumpfiltersvn loadsvn mv 的组合,我能够成功创建所需的结构。

以上是关于关于合并多个 svn repos 的说明的主要内容,如果未能解决你的问题,请参考以下文章

如何将不同机器上的 2 个不相关的 svn 存储库合并到一个存储库中?

如何利用SVN合并代码

Xcode 4.3 如何使用 SVN 合并来自两个开发人员的故事板更改?

将多个 SVN 存储库合并为一个

详细说明svn分支与合并---命令行

svn分支开发与主干合并(branch & merge)