11

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

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

您将如何解决这个问题,最大限度地减少将 Extension 泄漏到 Core 的风险(一旦历史被推送到公共服务器,就没有回头路了!),同时保持灵活地为某些更改执行此操作。分支机构?克隆人?MQ?还有什么?

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

编辑: 我想出了这个方案,但我不能让它在 Windows 下工作。两个存储库(核心和扩展)。在 Extension 中有两个分支,也是 Core 和 extension。现在,您可以在 Mercurial 中为每个存储库注册一个钩子,因此我想在核心存储库中注册一个“pretxnchangegroup”钩子,该钩子不允许从扩展分支签入,如Mercurial book 中所述。除了我不太明白它在 Windows 下工作。所以:

  • 任何人都有这样的例子(事实上,任何改变交易结果的钩子)在windows下?
  • 我仍然可以使用移植来挑选从扩展到核心分支的更改,对吗?
4

3 回答 3

2

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

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

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

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

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

希望这对其他人有帮助。

于 2009-03-06T19:07:44.410 回答
1

(历史一推,就没有回头路了!)

当然有......这就是版本控制的全部内容!

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

于 2009-03-02T20:40:06.420 回答
1

Forest 扩展允许您将多个存储库作为一个大存储库的一部分。听起来这可能会有所帮助。

于 2009-03-02T21:02:49.500 回答