12

我最近开始使用 MQ,因为我喜欢在不影响 repo 的情况下处理隔离补丁和提交的想法,直到变更集足够细化。在此之前,我曾经使用 Mercurial 的货架扩展,但发现它有点不稳定。我仍在 MQ 中试图弄清楚的是如何将补丁彼此分开,并以不特定的顺序应用它们,并跨不同的分支应用它们。这是我的正常流程-

1.开始制作新补丁:

hg qnew fix-bug-1234 -m "fix bug 1234"
# do some work
hg qrefresh

2.获得一个新的功能/错误来处理:

hg qpop fix-bug-1234
hg qnew some-feature -m "implement feature X"
# some work on feature X (perhaps in a different branch)
hg qrefresh

3.在这一点上,我想回到 bugfix 的工作,并把功能工作放在一边。我认为这很简单:

hg qpop some-feature
hg qpush fix-bug-1234
# wrap up bug fix
hg qfinish fix-bug-1234
# get back to work on feature

但是,MQ 似乎总是使用该系列中创建的最新补丁,并且无论我使用的是什么 qpop/qpush 命令都应用它。我应该注意,我处理的文件也是完全独立的(尽管它们有时可能是相同的)。

我在这里错过了什么吗?我应该hg qqueue为此使用吗?谢谢。

4

3 回答 3

10

你可以使用警卫。它们允许您在不重新排列series文件的情况下维护补丁的顺序,并有选择地仅应用补丁的子集,仍然以堆栈排序的方式。

你的例子是:

hg qnew bugfix
# ..hack hack..
hg qrefresh
# want to switch over to working on some feature now
hg qpop
hg qnew feature
# ..hack hack..
hg qrefresh

在这一点上,您的堆栈中出现补丁feature之前的情况。bugfix现在您可以使用守卫来选择一个或另一个,并在两者之间切换:

hg qpop -a
hg qguard feature +featureguard
hg qguard bugfix +bugfixguard

如果您想从事以下工作feature

hg qselect featureguard
hg qpush
applying feature
now at: feature

如果您想从事以下工作bugfix

hg qpop -a
hg qselect bugfixguard
hg qpush
applying bugfix
now at: bugfix

请注意,由于您选择了正防护 bugfixguard,MQ 跳过feature(因为它的正防护与所选防护不同)并bugfix改为应用补丁(确实与所选防护匹配)。

使用保护时的一些有用工具是hg qseries -v,它将显示一个G而不是通常U用于保护的、未应用的补丁,hg qselect -l并将显示与每个补丁关联的保护。

于 2011-10-31T13:27:31.080 回答
9
  1. 执行hg qpop -a以从堆栈中删除所有补丁
  2. 执行hg qpush --move some-patch以应用“一些补丁”而不应用补丁堆栈中可能存在的任何其他补丁
于 2011-10-31T09:20:11.833 回答
4

不,你没有错过任何东西。该mq扩展确实做了一个相当强的假设,即补丁队列是线性的。如果您要创建多补丁功能/修复,那么qqueue将可以工作......但是如果您的功能/修复只是单个补丁,并且您希望能够应用一个而不应用其他补丁,那么重新创建可能会更容易-arrange .hg/patches/series(存储应用补丁的顺序)。

我这样做(和手工编辑补丁)足够我有一个 shell 别名:

alias viq='vim $(hg root)/.hg/patches/series'

或者,如果您不介意同时应用多个补丁,您可以使用qgoto

$ hg qser
0 U bug-1234
1 U feature-4321
$ hg qgoto feature-4321
$ hg qser
0 A bug-1234
1 A feature-4321
于 2011-10-31T07:59:34.320 回答