适当的 Mercurial 工作流程,用于维护两个具有共享状态的独立配置

Proper mercurial workflow for maintain two separate configurations with shared state

我正在使用 hg 来管理一些配置文件,我正在寻找一些有关工作流程的建议。

发布版本有两种可能的配置,比如 A 和 B。两者的大部分设置相同,但也有一些差异。我想使用存储库以满足这些条件:

我有过并在不同程度上探索过的几个想法:

这工作正常,但意味着更改必须在两个独立的地方同步,这很烦人且容易出错。

我还没有实际使用过 mq 并且互联网似乎暗示它几乎已被弃用并且不应使用,因为它在备份更改方面存在问题。这可能是对它的合法使用,但我希望在使用此路径之前得到其用户的确认。

这种方法似乎是合理的,但是 (1) 每当应用 hg graft 时,历史记录都会充满额外的头部(我不能真正去除它们,因为它们将被发布到服务器以进行重新分发), (2) 每当编辑普通文件时都需要一个额外的步骤,(3) 我还没有想出如何在 hg graft-ing 时创建一个新分支,所以我必须记得重新更新到 config-a 在进行常见更改时提示,以及 (4) 如果从 A 切换到 B 的变更集被修改或获得额外的步骤,我不清楚如何很好地跟踪 "this sequence of changesets that moves A to B but doesn't actually have a head" (该措辞实际上听起来很像 mq).

(请使用上面的标准来保持基于事实的答案而不是主要基于意见[是的,添加它不会被关闭:-)])

我在一个存储库中使用了两个命名分支,它工作正常。我总是在同一个分支(比如 "config-a")中进行常见的更改,然后合并到另一个分支。它涉及一些 post 处理,因为您总是必须合并常见的东西,但是一旦您习惯了它就不会花费那么多时间,例如:

hg update config-a
<change some files>
hg commit -m "Some common config change"
hg update config-b
hg merge config-a
hg commit -m "Merge from config-a"

合并总是从 a 到 b,因此特定于 b 的更改永远不会在 a 中进行。但是,当对 a 进行特定的更改时,您必须记住在合并到 b 时将其还原(又名 "dummy merge" 它),例如:

...
hg update config-b
hg merge config-a
hg revert --all --rev .
hg commit -m "Dummy merge from config-a"

除了执行 hg revert,您还可以手动编辑文件以使更改适应 config-b。

编辑:根据 Mercurial doc,进行虚拟合并并防止任何外部合并工具在发生冲突时弄乱它的安全方法是这样做:

hg -y merge --tool=internal:fail config-a
hg revert --all --rev .
hg resolve -a -m