我如何在Mercurial中维护客户之间的多条开发线?

我如何在Mercurial中维护客户之间的多条开发线?,mercurial,tags,branch,legacy,Mercurial,Tags,Branch,Legacy,我致力于为多个客户维护同一个电子商务web应用程序 最初,有一组标准的页面,所有其他的客户定制都是从这些页面派生出来的 最近,我工作的地方决定使用Mercurial进行版本控制。他们还决定为我们的电子商务重新设计一套标准页面,使之成为开发的主线/基线 也就是说,我们的每个客户都有在基线页面集之前进行的现有定制,这些页面尚未进入版本控制(hg) 在我们为每个客户保留现有定制的同时,将开发基线中的变更合并为单独的开发线的最佳方式是什么?取决于您对每个项目的定制程度,最简单的方法可能是为每个客户创建

我致力于为多个客户维护同一个电子商务web应用程序

最初,有一组标准的页面,所有其他的客户定制都是从这些页面派生出来的

最近,我工作的地方决定使用Mercurial进行版本控制。他们还决定为我们的电子商务重新设计一套标准页面,使之成为开发的主线/基线

也就是说,我们的每个客户都有在基线页面集之前进行的现有定制,这些页面尚未进入版本控制(hg)


在我们为每个客户保留现有定制的同时,将开发基线中的变更合并为单独的开发线的最佳方式是什么?

取决于您对每个项目的定制程度,最简单的方法可能是为每个客户创建一个单独的模板树,优先于基本集。如

base/template1.html

customer/template1.html
对于任何页面,首先搜索客户的目录。您不需要太多版本控制魔法,但是子存储库可能会很方便

您可以使用
mq
(Mercurial队列)作为补丁集跟踪每个客户的更改。合并补丁集可能有点棘手

你也可以用它做同样的事情,可能比
mq
更优雅,但我不知道如何共享重基集

或者,您可以简单地为每个客户保留一个基本存储库和单独的存储库,这些存储库永远不会被拉回到基本存储库中

在每种情况下,如果您组织项目,使每个客户的定制受到限制,从而减少与核心产品更改的冲突,那么您的生活(合并)将更加轻松

在我们为每个客户保留现有定制的同时,将开发基线的变更合并为单独的开发线的最佳方式是什么

就像在任何其他分支场景中一样。Eg、 :

alice ~/wc/cust-XYZ % hg pull -u $xyz
alice ~/wc/cust-XYZ % hg ci
alice ~/wc/cust-XYZ % hg ci
alice ~/wc/cust-XYZ % hg ci
alice ~/wc/cust-XYZ % hg pull $mainline
alice ~/wc/cust-XYZ % hg merge
alice ~/wc/cust-XYZ % hg ci
alice ~/wc/cust-XYZ % hg push $xyz

我会——而且已经——拥有一个公共存储库,并为新客户克隆它。当您有一个补丁应该进入公共存储库时,或者有一组补丁需要从公共存储库应用到客户的回购中时,您可以使用hg移植。

什么是$xyz?这是一个环境变量吗?是的(确切地说,是一个shell变量)。在示例中,它用于抽象出客户xyz分支的规范存储库的url或路径;类似地,
$mainline
。alice的
~/wc/cust XYZ
是从位于
$XYZ
的存储库中克隆出来的……仍然在查看您的答案,它有几个选项。听起来您最初的问题可能是将客户的存储库与基本存储库合并,并手动选择更新的位。在这种情况下,您可以将所有基本文件添加到一个存储库中,将所有客户的文件添加到另一个存储库中,然后将这些文件拉到一起并“合并”。这很枯燥,但使用图形化合并工具,您应该能够相当快地从每一个侧面找出您认为较新的位。完成后,基本修订版和合并修订版之间的差异应包含特定于该客户的所有更改。