在大型组织中使用Mercurial

时间:2010-03-19 17:23:43

标签: mercurial dvcs

我已经将Mercurial用于我自己的个人项目一段时间了,我喜欢它。我的雇主正在考虑从CVS转换到SVN,但我想知道我是否应该推动Mercurial(或其他一些DVCS)。

Mercurial的一个问题是它似乎是围绕每个“项目”拥有一个存储库的想法而设计的。在此组织中,当前CVS存储库中有许多不同的可执行文件,DLL和其他组件,这些组件按层次结构组织。有许多通用的可重用组件,但也有一些客户特定的组件和客户特定的配置。当前的构建过程通常会从CVS存储库中获取一些子树。

如果我们从CVS迁移到Mercurial,那么组织存储库/存储库的最佳方法是什么?我们应该有一个包含所有内容的巨大Mercurial存储库吗?如果不是,那么较小的存储库应该有多细粒度?我认为如果他们必须从许多不同的地方提取和推送更新,人们会觉得非常烦人,但如果他们必须拉/推整个公司的代码库,他们也会觉得很烦人。

有人有这方面的经验或建议吗?


相关问题:

3 个答案:

答案 0 :(得分:55)

答案 1 :(得分:44)

答案 2 :(得分:8)

首先,最近关于在大型项目中使用DVCS的一些讨论是相关的:

Distributed version control for HUGE projects - is it feasible?

  

Mercurial的一个问题是它似乎是围绕每个“项目”拥有一个存储库的想法而设计的。

是的,虽然Subversion的标准是拥有一个包含多个项目的单一存储库,但使用DVCS时,最好有更多粒度的存储库,每个组件一个。 Subversion具有svn:externals功能,可在结账时聚合多个源树(具有自己的后勤和技术问题)。 Mercurial和Git都有类似的功能,在hg中称为subrepos

subrepos的想法是每个组件都有一个repo,可释放的产品(包含多个可重用的组件)将简单地引用其依赖的repos。当您克隆产品仓库时,它会带来所需的组件。

  

我们是否应该拥有一个包含所有内容的巨大Mercurial存储库?如果不是,那么较小的存储库应该有多细粒度?我认为如果他们必须从许多不同的地方提取和推送更新,人们会觉得非常烦人,但如果他们必须拉/推整个公司的代码库,他们也会觉得很烦人。

当然可以拥有一个整体存储库(如果需要,您甚至可以将其拆分为轨道)。这种方法的问题更可能归结为发布schedles,以及如何管理不同组件的不同版本。如果您有多个产品,他们自己的发布计划共享通用组件,那么您可能会采用更细粒度的方法,以促进配置管理。

有一点需要注意的是,subrepo支持是一个相对较新的功能,并不像其他功能那样完全成熟。具体来说,并非所有的hg命令都知道subrepos,尽管最重要的是。

我建议您执行测试转换,并尝试使用subrepo支持,组织产品和相关组件等。我正在做同样的事情,这似乎是要走的路。