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

在使用mercurial的多模块项目中维护分支和标记,mercurial,Mercurial,我在一个有许多模块的应用程序中工作,每个模块都有自己的mercurial存储库 我最初认为将模块放在单独的存储库中是好的,但在几个版本之后,我觉得有些地方不对劲。在所有模块中创建分支和标记真的很痛苦 大多数(如果不是所有的话)模块都遵循类似的发布周期 我是否应该继续为所有模块使用单个存储库?还是有更好的方法?所有模块的单一存储库意味着它们在开发生命周期中紧密耦合: 任何分支都适用于所有模块(这是您想要的) 任何标记都适用于所有模块(可能不是您想要的) 如果您的软件的“v1.2”对您的每个模块

我在一个有许多模块的应用程序中工作,每个模块都有自己的mercurial存储库

我最初认为将模块放在单独的存储库中是好的,但在几个版本之后,我觉得有些地方不对劲。在所有模块中创建分支和标记真的很痛苦

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


我是否应该继续为所有模块使用单个存储库?还是有更好的方法?

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

  • 任何分支都适用于所有模块(这是您想要的)
  • 任何标记都适用于所有模块(可能不是您想要的)
如果您的软件的“v1.2”对您的每个模块都有任何意义,那么是的,将它们全部放在一个回购协议中是有用的

如果一些模块位于v2.4,而另一个位于v3.6,另一个位于“v4.5”和…,则最好将独立模块声明为subrepos


评论:

如果您正在共享组件和通用框架库之类的东西,那么它们属于它们自己的存储库

这是正确的,因为所述组件和通用框架库的开发生命周期与主程序的开发生命周期完全无关

但OP补充道:

我们有两套模块:

  • 一组核心模块,可跨多个应用程序和应用程序重用
  • 各应用程序的另一组模块
因此,其中一些模块(“核心模块集”)可以保留为子回购协议(由母回购协议和主项目引用的独立回购协议)


其他模块可以直接合并到父repo中(有点像),您提到的Hg提示是:“

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

[编辑:基于评论]

结构如下所示:

  • 您拥有核心模块~平台
  • 利用核心模块的各种其他应用程序/模块
  • 在这种情况下,平台或核心模块的开发速度可能与应用程序模块不同。最好将它们分离到单独的存储库中。起初,它们可能遵循类似的发布周期,这看起来确实很诱人,但在任何典型的平台/应用程序开发中,它们都是独立的、不同步的。至少这是我的经历

    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--------------
    
    在所有模块中创建分支和标记真的很痛苦

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

    如果您使用Subrepo(或者更好,确切地说,是为您的用例创建的,并作为Subrepo缺陷的补偿)扩展,并且您的产品是“SuperRepo”,它只包含链接的sub | Guestrepo,那么:

    对于处于Superrepo状态的所有子repo的每个变更集,都是已知的和预定义的(每个定义都包含外部repo的变更集ID)。因此:

    • 然后标记,只能标记Superrepo-标记的变更集将具有所有(不可变)关系
    • 然后您进行分支,您可以根本不分支子模块,或者在需要开发时分支子模块,而不是策略(SuperRepo的最终结果-更改了链接到此子Repo的变更集ID):分支“Release N”不需要在子模块上进行相同的分支,只是在SuperRepo中需要稍微多一些手工操作

    从灵活性和可管理性的角度来看,我仍然倾向于为每个低级模块(自给自足的对象,没有外部依赖)单独回购,并为收集产品中的模块和管理产品生命周期中的产品创建GuestRepo-我看不到“分支|标记噩梦”这里

    特别是如果您正在共享组件和通用框架库,它们属于它们自己的存储库。@Lasse:是的,因为所述组件和通用框架库的开发生命周期与您的主程序完全无关。但OP的问题似乎暗示这些“模块”不属于“共享组件”的范畴。感谢VonC和Lasse的宝贵意见。我们有两套模块,一个可恢复的“核心”模块和特定于应用程序的其他模块。根据您的提示,我认为我应该为这些相关模块组使用两个存储库。我希望“组合”相关模块存储库以保存更改集。我正在考虑使用本文中提到的技巧。谢谢你,派芬克。我基本上有两组模块,一组核心模块可以在许多应用程序中重用,另一组模块用于各自的应用程序。@詹姆斯:我认为平台/核心应该独立于应用程序。根据规模的不同,一个典型的大型平台的开发速度要比应用程序快。谢谢你漂亮的解释。起初我对此感到非常困惑。我想知道是否应该使用subrepos功能。但那是完全错误的。“次级回购”这个词真让我困惑。再次感谢你们所有花费宝贵时间帮助我的人。很好的说明+1.我同意你的经验,这些模块“独立且不同步”。