在使用mercurial的多模块项目中维护分支和标记
我在一个有许多模块的应用程序中工作,每个模块都有自己的mercurial存储库 我最初认为将模块放在单独的存储库中是好的,但在几个版本之后,我觉得有些地方不对劲。在所有模块中创建分支和标记真的很痛苦 大多数(如果不是所有的话)模块都遵循类似的发布周期在使用mercurial的多模块项目中维护分支和标记,mercurial,Mercurial,我在一个有许多模块的应用程序中工作,每个模块都有自己的mercurial存储库 我最初认为将模块放在单独的存储库中是好的,但在几个版本之后,我觉得有些地方不对劲。在所有模块中创建分支和标记真的很痛苦 大多数(如果不是所有的话)模块都遵循类似的发布周期 我是否应该继续为所有模块使用单个存储库?还是有更好的方法?所有模块的单一存储库意味着它们在开发生命周期中紧密耦合: 任何分支都适用于所有模块(这是您想要的) 任何标记都适用于所有模块(可能不是您想要的) 如果您的软件的“v1.2”对您的每个模块
我是否应该继续为所有模块使用单个存储库?还是有更好的方法?所有模块的单一存储库意味着它们在开发生命周期中紧密耦合:
- 任何分支都适用于所有模块(这是您想要的)
- 任何标记都适用于所有模块(可能不是您想要的)
评论: 如果您正在共享组件和通用框架库之类的东西,那么它们属于它们自己的存储库 这是正确的,因为所述组件和通用框架库的开发生命周期与主程序的开发生命周期完全无关 但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.我同意你的经验,这些模块“独立且不同步”。