2

您如何管理 DVCS 中的公共库源?

目前,我的团队使用 Perforce 来管理我们的软件项目。使用 Perforce 的“工作空间映射”功能,我能够轻松地将公共库源映射到开发应用程序目录中,从而保持源管理和开发项目工作之间的转换透明。例如,存储库看起来像这样:


单片机树结构

    • 应用
      • 论坛网站
      • 管理工具
    • 常见的
      • 事件记录器
      • json.parser
    • D b
      • 用户
      • 站点配置

由于漂亮的 P4 映射功能,我们的开发人员可以为他们工作的项目提取一整套源代码,以使用工作区映射最有意义的形式。典型的开发项目文件夹可能如下所示:


开发项目文件夹

/projects
    /FALL-2009
        /ForumSite
            /deps
                /event.logger
                /json.parser
        /AdminTool
            /deps
                /event.logger
                /json.parser
        /Users-db
        /SiteConfiguration-db
    /FALL-2009-PATCH-01
        /json.parser
        /SiteConfiguration-db
    /FALL-2009-PATCH-02
        /AdminTool
            /deps
                /event.logger
                /json.parser
        /SiteConfiguration-db

当开发人员在他/她的任何组件或应用程序中编辑源代码时,这些更改将映射回正确版本点的正确源代码控制目录。这对开发人员来说是透明的,减少了管理的复杂性和建立新项目的时间。

我正在研究 Git、Bazaar 和 Mercurial 作为 Perforce 的潜在替代品。谁能提供有关在 DVCS 世界中如何处理常见组件源的见解?

4

4 回答 4

6

在 Git 中,您将git submodule用于此目的。

Git 子模块存储为对来自另一个存储库的修订的引用,以及提供用于查找另一个存储库的 URL 的文件。当您执行 agit submodule update时,Git 将克隆引用存储库的副本(或者您可以将其配置为指向不同 URL 的同一存储库的不同副本,因为它是 DVCS,因此任何包含引用的修订版也可以使用),然后查看引用的修订版。

可悲的是,它并不像人们希望的那样无缝。在父存储库中签出新修订版实际上并不签出子模块;你需要做一个明确git submodule update的来完成这个。我们已经尝试将包装git pull; git submodule update作为单个命令,但是还有许多其他命令(例如git rebase)涉及签出文件,这可能会使您陷入混乱状态,因为它们也不会更新子模块。一旦你熟悉了子模块的工作原理,一切都会好起来的,但它会带来一些摩擦。

于 2010-01-02T06:10:20.680 回答
4

两天前以一种反复无常的方式提出了一个非常相似的问题:

人们如何管理对存储在多个(Mercurial)存储库中的公共库文件的更改?

Subrepo 支持,现在在 Mercurial 中得到很好的支持,似乎是您设置的最佳选择。

于 2010-01-02T07:03:49.297 回答
2

In Bazaar I'm using plugin scmproj which allows me to specify required configuration of components, so I can provide any map between actual branches and their set on local disk, as you described.

于 2010-01-02T07:14:50.003 回答
1

我们正在使用 git,并且对它的子模块功能非常满意。它让您可以将其他 git 存储库集成到当前的存储库中,当然,还需要修订。我能看到什么,效果很好:-)

于 2010-01-02T05:50:00.880 回答