在使用mercurial的多模块项目中维护分支和标记

时间:2010-11-09 07:40:17

标签: mercurial

我正在使用许多模块的应用程序,每个模块都有自己的mercurial存储库。

我最初认为将模块放在单独的存储库中是好的,但经过几次发布后,我觉得有些不对劲。在所有模块中创建分支和标签真的很痛苦。

大多数(如果不是所有)模块都遵循类似的发布周期。

我应该继续使用单个存储库来存储所有模块吗?或者有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

所有模块的单个存储库意味着它们在开发生命周期中紧密耦合:

  • 任何分支都适用于所有模块(这是您想要的)
  • 任何标签都适用于所有模块(可能不是您想要的)

如果您的软件的“v1.2”对于您的每个模块都有任何意义,那么是的,将它们全部放在一个回购中是有用的。

如果某些模块处于v2.4而另一个模块处于v3.6,而另一个模块处于“v4.5”和......,那么将独立模块声明为subrepos是最好的。


Lasse V. Karlsen评论:

  

如果您正在共享组件和通用框架库等内容,则它们属于自己的存储库

哪个是对的,因为所述组件和一般框架库的开发生命周期与主程序之一完全无关

但OP补充道:

  

我们有两套模块:

     
      
  • 一组可以在许多应用程序中重复使用的核心模块
  •   
  • 相应应用程序的另一组模块
  •   

因此,其中一些模块(“核心模块集”)可以保留为子目录(由父级仓库和主项目引用的独立仓库)。

其他人可以直接合并到父级仓库(有点像git subtree merge strategy),你提到的Hg提示:“Combining Repositories

答案 1 :(得分:2)

如果所有这些模块属于单个项目,则它们应该具有单个存储库。模块代码可以在单个仓库中的目录中分组。

[编辑:根据评论]

结构如下:

  1. 你有核心模块〜平台
  2. 利用核心模块的各种其他应用/模块。
  3. 在这种情况下,平台或核心模块可以以与app模块不同的速度开发。最好将它们分隔成单独的存储库。最初,它看起来很诱人,它们都可能遵循类似的发布周期,但在任何典型的平台/应用程序开发中,它们都会独立出去并且不同步。至少这是我的经历。

    P1 -------P2 ------P3 ------p4
    
    A1------A2--------------A3--------- (A1, A2, A3 utilize platform P1, P2, P3..)
    
    B1--------B2----------B3---------   (B1, B2, B3 utilize platform P1, P2, P3..)
    
    A3------------------B3--------------
    

答案 2 :(得分:0)

  

在所有模块中创建分支和标签真的很痛苦

因为这根本不需要 (“在所有模块中”)。

如果您使用Subrepo(或更好,GuestRepo - 完全为您的用例创建并补偿某些subrepo的缺点)扩展和您的产品是“SuperRepo”,其中只包含链接子| guestrepos,然后:

对于所有子回购的Superrepo状态中的每个和每个变更集已知且预定义(每个定义包含外部回购的变更集ID)。因此:

  • 然后你标记,你可以(只)标记Superrepo - 标记的变更集将具有所有(不可变的)关系
  • 然后你分支,你可以根本不分支子模块,或者在需要开发时分支子模块,而不是用于策略(在任何情况下SuperRepo的最终结果 - 在链接中更改了变更集ID到这个subrepo):分支“Release N”在子模块上不需要相同的分支,在Superrepo中只需要略多的手工

从POV的灵活性和可管理性来看,我仍然更喜欢单独的回购每个低级模块(自给自足的对象,没有外部依赖)和GuestRepo用于收集产品中的模块和管理产品在它的生命周期中 - 我无法在这里看到“分支|标记噩梦”