Subversion - 合并存储库

时间:2008-12-17 20:14:47

标签: svn

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

这已经有一段时间了,但是我正盯着认为我想将所有这些存储库合并到一个整体的“公司范围”存储库中,所以当我让员工查看源代码时,他们可以只需从顶部结帐并获得所有不同项目的所有代码。

我在网上找到了svn-merge-repos命令,但没有很多用户反馈或使用它的有用提示。这是加入存储库的最佳方式,因此我不会丢失历史数据,还是有更好的方法?是否有任何陷阱需要注意?

感谢。

5 个答案:

答案 0 :(得分:23)

我最近不得不做类似的事情而且我做的事情本质上是:

* 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,而且该存储库位于工作文件夹中。 / p>

此时,您将最终得到RepositoryC,其中包含RepositoryA和RepositoryB,分别位于trunk \ A和trunk \ B下,最重要的是,您的更改历史记录将保留在RepositoryA和RepositoryB中。您的工作文件夹还包含一个名为RepositoryC的文件夹,其中包含一个Checkout out RepositoryC。

现在,您可以在RepositoryC中移动,以统一两个存储库RepositoryA和RepositoryB的项目结构。

答案 1 :(得分:9)

请不要强迫您的用户签出整个存储库以构建内容。这可以追溯到旧的sourceafe模型,然而它并不好。

每个项目有一个存储库罚款。 如果project1需要来自project2的代码,请将“svn:externals”属性添加到project1的trunk,这会将project2带到project1目录下的合理位置。如果project2需要project3的代码,它也可以有一个外部属性并将代码放在其下面。

实际上,如果外部引用始终指向标记或特定修订版,那么最好,但如果您避免“一个巨大的项目空间”问题,我会让您指向主干。

如果您使用外部人员,任何人都可以检查他们想要的项目,并且自动获取所有依赖项并且只是随意构建 - 就像您想要的那样。他们所有的代码都是自包含在一个工作目录中,只包含他们需要的东西,他们可以将多个项目的多个版本签出到单独的工作目录中,而不会浪费空间,并且仍然可以跟踪到底发生了什么。

如果project1希望在项目文件夹之外而不是在内部找到project2,可能需要对工作区进行一些小的重构,但这只是对宏观方案的一个小调整。

如果您确实将自己的心脏设置在一个存储库中,那也很好(这就是我们在工作场所使用的,在家里,想到它),但要确保您拥有每个项目都有的结构它自己的标签,主干和&amp;分支文件夹,检查project1的主干是你需要做的所有来获取要构建的project1的代码。

最后,如果你真的需要一个时髦的项目布局,你可以添加一个额外的单一存储库,它基本上是一个元存储库。 该存储库将包含每个顶级项目的1个目录(带有主干标签和分支),并使用外部,引用所有其他项目,并以您期望的方式构建时髦的工作区。

这样,通过添加额外的存储库,您可以获得一步完成检出和构建的所有好处,并且至少有可能管理project1因project2共享的代码而中断project3所需的更改的情况,并且您突然需要为项目3进行紧急修复。

答案 2 :(得分:4)

您可以使用svn-merge-repos.pl,也可以将多个存储库转储与SvnDumpTool合并合并,然后使用svnadmin load --ignore-uuid加载生成的转储。

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

检查SvnDumpTool readme的合并部分。

答案 3 :(得分:2)

如果您只想让存储库看起来统一,您可以使用svn:externals属性,这样一次结帐就会从所有现有的存储库中提取代码。

答案 4 :(得分:1)

不要那样做。正如@KeithB所说,使用svn:externals引用它们应该没问题。

最好将每个项目维护在自己的存储库中,这样您就可以轻松地存档旧项目,并且还可以提高整体性。

例如,apache基础为其所有项目维护a single repository(我不知道它是从其他repos复制还是活动的)。现在,它的历史重量为700k +修订版。我不希望看到这个怪物受损。