使用Mercurial分隔私有版本和公共版本

时间:2009-03-02 12:44:32

标签: mercurial

如何使用Mercurial解决以下问题。

假设我有一个库Core。我现在想要开发一个名为Extension的扩展库。我想让Core在物理上与Extension分开,即假设Core是一个开源库,而Extension是一个基于Core的私有库(也许它包含一些我想保留个人的东西。无论如何。)。显然,我不想将Extension中的整个源代码推送到公共存储库。但另一方面,我可能希望将某些更改从Extension扩展到Core(如果我决定“将扩展的一部分”捐赠给Core),反之亦然(如果我想合并bug修复,请说)。

你将如何解决这个问题,最大限度地降低扩展到Core的风险(一旦将历史记录推送到公共服务器,就没有回头!),同时保持灵活性,以便对某些更改进行此操作。分行?克隆? MQS?别的什么?

我目前只熟悉克隆存储库,非常喜欢它的简单性。

修改 我提出了这个计划,但我无法让它在Windows下工作。 两个存储库(核心和扩展)。在Extension中有两个分支,也是Core和扩展。现在,你可以在Mercurial中为每个存储库注册一个钩子,所以我想在Core repo中注册一个'pretxnchangegroup'钩子,它不允许来自Extension分支的签入,就像解释in the Mercurial book一样。除了我不太明白在Windows下工作。所以:

  • 任何人都有一个类似这样的例子(事实上,任何改变交易结果的钩子)都在windows下?
  • 我仍然可以使用移植来实现从Extension到Core分支的改变,对吗?

3 个答案:

答案 0 :(得分:2)

经过一些测试,我将尝试这个方案。两个主存储库和两个命名分支,核心和扩展。

一个主要的Core存储库,它应该只包含Core变更集和源。因此,它应仅包含Core分支的更改集。 使用该repo的hgrc中的以下存储库钩子检查:

pretxnchangegroup.branch = hg heads --template "current branches: {branches} " | find "Extension" && exit 1 || exit 0

看起来有点奇怪,但基本上它在推或拉完成之后但在提交之前被触发。此时,如果挂钩失败,则回滚事务。因此,钩子会查找Extension分支的变更集,如果找到它则会失败 - 实际上禁止Extension更改进入Core repo。

第二个repo包含Core和Extension分支以及变更集,并且是两个分支之间交换变更集的地方。正常从Core到Extension合并,并从Extension移植到Core。

希望这有助于其他人。

答案 1 :(得分:1)

  

(一旦推动历史,就会有   不回去!)

确定有......这就是版本控制的全部内容!

之前我没有做过这样的事情,但听起来transplant命令会有所帮助。此外,您可以克隆克隆,并推送到其中任何克隆,等等。

答案 2 :(得分:1)

Forest extension允许您将多个回购作为大回购的一部分。这听起来很有帮助。