如何防止Mercurial补丁被拉取?

4
到目前为止,我还没有找到一个清晰的答案,尽管可能的答案是“改变你的工作流程”。
我刚刚开始使用Mercurial的补丁队列,并发现它具有一些强大的功能。看起来非常棒。在我的测试中,我发现如果你在repo1中有一个补丁队列,并从repo2中拉取,你可以做一些坏事情。例如:
  1. 创建仓库1并克隆它。
  2. 在repo1上启用队列
  3. 在repo1上进行一些提交和一些补丁
  4. 将更改拉到repo2
  5. 在repo1上取消应用所有补丁
  6. 将更改拉到repo2
现在你会看到两个不同的分支——从某种角度来看这是有道理的。然而,由于我的补丁不是repo1的历史的一部分(至少在它们被应用之前),似乎应该有一种方法告诉Mercurial我的补丁是禁止的,只提供“官方历史”中的内容。
有办法做到这一点吗?

我意识到我可以创建一个独立的代码库,克隆它,并在我的克隆中使用队列,但这会给我的工作流程增加一些额外的复杂性。而且似乎让其他人使用补丁也更加困难。 - Wayne Werner
mq 补丁的一个小秘密是,只要它们处于活动状态(qpush),它们就是您存储库历史记录的一部分。检查日志。qpop 会从存储库历史记录中删除补丁。再次 qpush 会创建一个新的、类似的变更集,并带有一个新的 ID。所以,mq 改变了历史记录。在拉取或推送到其他存储库之前,要么使用 qpop -all,要么尝试使用 phases 方法。 - Ned Deily
1个回答

8

Mercurial的阶段可能是解决这个问题的答案。

从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)

太棒了!今天我也刚刚了解到阶段,这个解决方案完美地解决了我的问题,谢谢! - Wayne Werner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接