【问题标题】:Subversion - Merging Repositories [duplicate]Subversion - 合并存储库 [重复]
【发布时间】:2010-09-27 09:55:40
【问题描述】:

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

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

我在网上找到了svn-merge-repos 命令,但没有很多用户反馈或有用的使用技巧。这是加入存储库的最佳方法,这样我就不会丢失我的历史数据,还是有更好的方法?有什么需要注意的陷阱吗?

谢谢。

【问题讨论】:

标签: svn


【解决方案1】:

我最近不得不做一些类似的事情,而我所做的本质上是:

* 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 的项目结构。

【讨论】:

【解决方案2】:

请不要强迫您的用户签出整个存储库来构建内容。这又回到了旧的 sourcesafe 模型,当时并不好。

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

如果外部引用总是指向一个标签或一个特定的修订版本是最好的,但如果你避免“一个巨大的项目空间”问题,我会让你不要指向主干。

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

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

如果您真的将心放在一个存储库上,那也很好(这就是我们在工作场所和家里使用的,请考虑一下),但是请确保您有一个结构,每个项目都有它自己的标签、主干和分支文件夹,并且检查 project1 的主干是您需要做的所有事情来获取构建 project1 的代码。

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

通过这种方式,通过添加额外的存储库,您可以获得一步签出和构建的所有好处,并且至少有机会管理由于与 project2 共享代码而导致 project1 所需的更改破坏 project3 的情况,并且您突然需要紧急修复项目 3。

【讨论】:

  • 这提出了一个替代解决方案,但实际上并没有回答这个问题。我仍然想知道如何合并单独的存储库。
【解决方案3】:

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

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

检查 SvnDumpTool readme 的合并部分。

【讨论】:

    【解决方案4】:

    如果您只是希望存储库看起来统一,您可以使用 svn:externals 属性,这样单次检出即可从所有现有存储库中提取代码。

    【讨论】:

      【解决方案5】:

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

      最好将每个项目都保存在自己的存储库中,这样您就可以轻松地归档旧项目,并获得更好的完整性。

      例如,apache 基金会为它的所有项目维护a single repository(我不知道它是从其他存储库复制的还是实时的)。现在,它的历史权重超过 70 万次修订。我不希望看到这个怪物受到伤害。

      【讨论】:

        猜你喜欢
        • 2015-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        • 1970-01-01
        • 2012-11-23
        相关资源
        最近更新 更多