是否可以将修订版从一个 Subversion 存储库"append"到另一个存储库?



前一段时间,我们将Subversion存储库移到了一个新服务器("B")上,期望旧服务器("A")退役。

服务器/存储库A实际上从未退役,而且在我不知道的情况下,在源代码管理下的许多项目中,有一个从未更新过其工作副本引用。换句话说,该项目(以及该项目本身)的所有更改都已提交到旧服务器。

服务器上的特定项目没有任何更新,因此实际源中不存在任何冲突的可能性。但是,很明显,修订数字将不一致。

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

从本质上讲,我想问的问题类似于"如何将来自两个不同存储库的两个分支合并为一个存储库?"?除了这是针对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的新修订。

解决方案?

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

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

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

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

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

--incremental确保转储的更改是相对于修订版3的,修订版3应该与存储库A中已经存在的内容相匹配。

(为了安全起见,我会先用存储库a的一次性副本来测试这一点。)

最新更新