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

Kur*_*out 11 mercurial

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

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

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

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

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

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

Kur*_*out 2

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

一个主要的核心存储库,应仅包含核心变更集和源代码。因此它应该只包含来自核心分支的变更集。这是使用该存储库的 hgrc 中的以下存储库挂钩进行检查的:

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

看起来有点奇怪,但基本上它会在推或拉完成后、提交之前被触发。此时,如果挂钩失败,事务将回滚。因此,该钩子会查找扩展分支的变更集,如果找到它就会失败 - 有效地禁止扩展更改进入核心存储库。

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

希望这对其他人有帮助。