2008-12-17 102 views
16

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

这已经很好运行了一段时间,但我盯着认为我想将所有这些存储库合并到一个整体“公司范围”存储库中,因此当我让员工检查源代码时,他们只需从顶部签出即可获得所有不同项目的所有代码。

我在网上发现了svn-merge-repos命令,但没有提供很多用户反馈或有用的提示。这是加入存储库的最佳方式,所以我不会丢失我的历史数据,或者有更好的方法吗?我应该注意哪些缺陷?

谢谢。

+0

http://geekswithblogs.net/kariemali/archive/2009/06/02/how-to-merge-two-svn-repositories.aspx – JDPeckham 2012-07-12 15:40:17

回答

9

请不要强迫您的用户检出整个存储库以构建内容。这是回到旧的sourcesafe模型,它不是那么好。

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

实际上,如果外部引用总是指向一个标记或一个特定的修订版本,但如果避免出现“巨大的工程空间”问题,我会让您指向主干。

如果你与外部合作,任何人都可以结账他们想要的项目,并自动得到所有的依赖关系,只是建立 - 就像你想要的。他们所有的代码都包含在一个单独的工作目录中,其中包含了他们所需要的东西,他们可以将多个项目的多个版本检入到不同的工作目录中,而不会浪费空间,并且还能够跟踪到底是怎么回事。

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

如果你真的把自己的心设置在一个存储库上,那也没关系(这就是我们在工作场所和家中使用的想法),但是确保你有一个每个项目的结构有它自己的标签,主干&分支文件夹,检出项目1的主干为,您只需要做即可获取project1的代码。

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

通过这种方式,通过添加额外的存储库,您可以在一个步骤中获得签出和构建的所有好处,并且至少可以管理由于与project2共享代码而使project1需要的更改中断project3的情况;你突然需要紧急修复project3。

+5

这提出了一种替代解决方案,但实际上并没有回答这个问题。我仍然想知道如何合并单独的存储库。 – Justin 2009-11-13 23:03:32

4

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

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

检查SvnDumpTool readme的合并部分。

2

如果您只想将看作统一,您可以使用svn:externals属性,以便单个签出将从所有现有回购中拉入代码。

1

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

将每个项目维护在自己的存储库上会更好,因此您可以轻松归档旧项目,并且还可以获得更好的完整性。

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

21

最近,我不得不做类似的东西和我所做的是,在本质:

* 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上存在的库:\存储库和Subversion服务器的URL是http://localhost:8080,其中一个位于工作文件夹中。

此时,您将最终得到RepositoryC,它分别在trunk \ A和trunk \ B下包含RepositoryA和RepositoryB,最重要的是,您的更改历史记录将针对RepositoryA和RepositoryB进行维护。您的工作文件夹还包含一个名为RepositoryC的文件夹,其中包含一个结算出RepositoryC的文件夹。

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

+0

令人印象深刻。无论如何将多个文件夹从一个存储库移动到另一个存储库..?你可以看看我的问题http://stackoverflow.com/questions/28238863/include-multiple-folders-using-svndumpfilter – 2015-02-01 12:43:40