2012-06-06 51 views
4

到目前为止,我还没有找到明确的答案,但答案可能是“改变你的工作流程”。如何防止Mercurial补丁被拉?

我刚开始玩Mercurial的补丁队列,我可以看到它的一些严重的权力。它看起来非常棒。在我的测试中,我发现如果你在repo1有一个补丁队列,并且你从repo2中取出,你可以做一些坏事。例如:

  1. 创建回购站1并克隆它。
  2. 启用repo1
  3. 队列使一些提交和一些补丁上repo1
  4. 拉更改repo2
  5. repo1不应用(弹出?)所有的补丁
  6. 拉更改repo2

现在你会看到两个不同的分支 - 这从某个角度来看是有意义的。但是,由于我的补丁不是repo1的历史记录的一部分(至少在它们被应用之前),似乎应该有一种方法可以告诉mercurial我的补丁是不受限制的,并且只提供了什么“官方历史”。

有没有办法做到这一点?

+0

我知道我可以创建一个独立的存储库,克隆它,然后在我的克隆中使用队列,但它为我的工作流程增加了一点额外的复杂性。此外,看起来像让其他人也可能更难让其他人使用补丁。 –

+0

mq补丁的晦涩秘诀在于它们*是* repo历史记录的一部分,当它们处于活动状态时('qpush'-ed)。检查日志。 'qpop'从回购历史记录中删除补丁。而'qpush'-ing再次创建一个新的,虽然类似的变更与一个新的ID。所以,'mq'改变了历史。在拉动或者推入其他回购或者尝试“阶段”方法之前,可以选择“qpop -all”。 –

回答

8

Mercurial phases可能是对此的答案。

从Mercurial v2.1开始,您可以配置mq变更集以自动标记为secretsecret变更集被incoming/pulloutgoing/push命令忽略。

要启用此行为,则需要以下内容添加到您的配置:

[mq] 
secret = True 

一旦启用,它的行为如下:

$ hg qpush --all 
applying my-patch 
now at: my-patch 

$ hg phase -r . 
16873: secret 

$hg outgoing 
comparing with https://www.mercurial-scm.org/repo/hg 
searching for changes 
no changes found (ignored 1 secret changesets) 
+0

美丽!我其实也是今天刚刚发现的阶段,这个解决方案完美运行,谢谢! –