Mercurial - 使用类似于货架的队列?

时间:2011-10-31 07:04:58

标签: mercurial workflow shelve mercurial-queue

我最近开始使用MQ,因为我喜欢处理孤立补丁和提交而不影响回购的想法,直到变更集足够精确。在此之前,我曾经使用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吗?感谢。

3 个答案:

答案 0 :(得分:10)

您可以使用guards。它们允许您维护补丁的顺序而无需重新排列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显示与每个补丁相关的警卫。

答案 1 :(得分:9)

  1. 执行hg qpop -a以从堆栈中删除所有补丁
  2. 执行hg qpush --move some-patch以应用“some-patch”而不应用补丁堆栈中可能存在的任何其他补丁

答案 2 :(得分:4)

不,你没有遗漏任何东西。 mq扩展确实假设补丁队列是线性的。如果您要创建多补丁功能/修复,那么qqueue将起作用......但是如果您的功能/修复只是单个补丁而您希望能够应用一个而不应用其他补丁,则可能更容易重新安排.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