是否可以将修订从一个subversion存储库“追加”到另一个?

时间:2011-06-21 18:15:51

标签: svn version-control

前段时间,我们将Subversion存储库移动到新服务器(“B”),期望旧服务器(“A”)退役。

好吧,服务器/存储库A实际上从未实际退役,而且我不知道,源代码控制下的众多项目之一从未更新其工作副本引用。换句话说,所有项目的更改(以及仅该项目)已经提交到旧服务器。

new 服务器上的特定项目没有任何的更新,因此实际上不存在任何冲突资源。但是,显然,修订号将不一致。

是否可以将提交到存储库A的更改合并到存储库B中?

基本上我要求的是类似于问题,How to combine two branches from two different repositories into a single repository?除了这是针对Subversion,而不是git,并且实际上没有任何分支,只有一组更改全部提交到trunk(在错误的存储库中)。

需要持续同步,这只是旧存储库最终真正退役之前的一次性操作。而且我更愿意为相关项目带来整个修订历史记录,即不仅仅是将最新版本作为一个大规模版本提交。

如果问题不完全清楚,这是一个视觉效果:

Repository A
  Project X:  Rev 1 -> Rev 2 -> Rev 3
  Project Y:  Rev 4 -> Rev 5 -> Rev 6

Repository B:
  Project X:  Rev 1 -> Rev 2 -> Rev 3 -> Rev 4 -> Rev 5 -> Rev 6
                                           |        |        |
Expected outcome for Repository A:         v        v        v
  Project X:  Rev 1 -> Rev 2 -> Rev 3 -> Rev 7 -> Rev 8 -> Rev 9
  Project Y:  Rev 4 -> Rev 5 -> Rev 6

我只想将A树的一部分(并且只有那部分)的所有修订复制到B的存储库,并将其他所有内容都保留。如果有必要的话,我对X的修订看起来像B的新版本。

解决方案?

2 个答案:

答案 0 :(得分:4)

您可以使用svnadmin dump来获取整个存储库的转储,然后使用svndumpfilter仅生成某个存储库路径的转储。然后使用svnadmin load将结果文件导入新存储库。

以下是一些示例:http://daveharris.wordpress.com/2008/08/05/svn-dump-parts-of-a-repository/

答案 1 :(得分:3)

只要两个存储库中的更改确实不重叠,您就可以执行以下操作:

svnadmin dump --incremental -r4:6 /repository/B | svnadmin load /repository/A

在存储库A中创建修订版7,8和9,保留作者,时间戳等。

--incremental确保转储的更改与版本3相关,版本3应与存储库A中已有的版本相匹配。

(为了安全起见,我会首先使用存储库A的一次性副本来测试它。)