Subversion - 合并仓库

16

我最初为不同的项目设置SVN结构时,决定将每个不同的项目放在单独的存储库中。

这样做一段时间以来一直很有效,但我开始考虑将所有这些存储库合并成一个总的“公司范围”存储库。这样,当我让员工检出源代码时,他们可以从顶部检出,并获得所有不同项目的所有代码。

我在网上找到了svn-merge-repos命令,但没有太多用户反馈或有用的使用提示。这是连接存储库的最佳方法,以便不会丢失我的历史数据,还是有更好的方法?我应该注意哪些陷阱?

谢谢。


http://geekswithblogs.net/kariemali/archive/2009/06/02/how-to-merge-two-svn-repositories.aspx - JDPeckham
5个回答

22

我最近也需要做类似的事情,我所做的是:

* svnadmin create X:\Repositories\RepositoryC
* svn mkdir http://localhost:8080/svn/RepositoryC/branches --message "Added the branches folder."
* svn mkdir http://localhost:8080/svn/RepositoryC/tags --message "Added the tags folder."
* svn mkdir http://localhost:8080/svn/RepositoryC/trunk --message "Added the trunk folder."
* svn mkdir http://localhost:8080/svn/RepositoryC/trunk/A --message "Added the trunk\A folder."
* svn mkdir http://localhost:8080/svn/RepositoryC/trunk/B --message "Added the trunk\B folder."
* svn checkout http://localhost:8080/svn/RepositoryC RepositoryC
* svnadmin dump X:\Repositories\RepositoryA > RepositoryA.dmp
* svnadmin dump X:\Repositories\RepositoryB > RepositoryB.dmp
* svnadmin load X:\Repositories\RepositoryC --parent-dir trunk\A < RepositoryA.dmp
* svnadmin load X:\Repositories\RepositoryC --parent-dir trunk\B < RepositoryB.dmp
* svn checkout http://localhost:8080/svn/RepositoryC RepositoryC
注意:上面的代码假定托管你的Subversion仓库的机器上,仓库位于X:\Repositories下,Subversion服务器的URL为http://localhost:8080,并且其中一个仓库在工作文件夹中。
到此为止,你将得到一个名为RepositoryC的仓库,其中trunk\A和trunk\B下分别包含了RepositoryA和RepositoryB,并且最重要的是,你的变更历史记录将维护在RepositoryA和RepositoryB中。此外,你的工作文件夹还将包含一个名为RepositoryC的文件夹,其中包含了RepositoryC的检出。
现在,你可以在RepositoryC中移动东西,以统一两个仓库RepositoryA和RepositoryB的项目结构。

很不错。有没有办法将多个文件夹从一个仓库移动到另一个仓库?您能否查看我的问题https://dev59.com/q4fca4cB1Zd3GeqPiWZT - Buddybear

9
请不要强制用户检出整个存储库来获取构建所需的内容。这会让人想起旧版本控制工具Sourcesafe的模式,而那并不好。
每个项目一个存储库是可以的。如果项目1需要从项目2中获取代码,请在项目1的主干上添加 "svn: externals" 属性,将项目2放在项目1目录下合适的位置。如果项目2需要项目3的代码,则它也可以有一个外部属性,并将代码放在其下。
最好始终将外部引用指向标记或特定的修订版,但如果避免了“一个庞大的项目空间”问题,我会让你指向主干。
如果你使用外部引用,任何人都可以只检出他们想要的项目,并自动获取所有依赖项,然后构建 - 就像你想要的一样。他们的所有代码都包含在一个单独的工作目录中,其中只包含他们需要的内容,他们可以将多个版本的多个项目检出到单独的工作目录中,而不浪费空间,并且仍然可以跟踪发生的情况。
如果项目1期望在项目文件夹之外找到项目2,而不是在其内部找到它,那么可能需要对你的工作区进行一些小的重构,但在大局方案中,这只是一个小调整。
如果你真的想要一个单一存储库,那也可以(我们在我的工作场所和家里都使用它),但请确保每个项目都有自己的标记、主干和分支文件夹,并且检出项目1的主干是获取构建项目1所需代码的所有步骤。
最后,如果你真的需要一个奇特的项目布局,可以添加一个额外的单一存储库,这基本上是一个元存储库。该存储库将包含每个顶级项目的1个目录(具有主干标记和分支),并使用外部引用引用所有其他项目,并按照你预期的方式构建奇特的工作区。
通过添加额外的存储库,您可以在一步中获取所有检出和构建的好处,并且至少有机会处理因与项目2共享的代码而导致的对项目3进行紧急修复的情况。

5
这提出了一种备选方案,但实际上并没有回答这个问题。我仍然想知道如何合并不同的代码库。 - Justin

4
您可以使用svn-merge-repos.pl,或者使用SvnDumpTool合并多个存储库转储文件,然后使用svnadmin load --ignore-uuid加载结果转储。

请注意,所有修订版将重新编号。

请查看SvnDumpTool readme中的合并部分。


2
如果您只是想让存储库“看起来”统一,可以使用svn:externals属性,这样单个检出将从所有现有的存储库中拉取代码。

2
不要这样做。正如@KeithB所说,使用svn:externals引用它们应该是可以的。
最好将每个项目都维护在自己的仓库中,这样你就可以轻松地归档旧项目,并且保持更好的完整性。
例如,Apache基金会为其所有项目维护一个单独的仓库(我不知道它是否从其他仓库复制或者是实时的)。现在,它的历史记录重量超过了700k个版本。我不想看到这个怪物被损坏。

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