如何使用mercurial队列将工作分成多个补丁?

时间:2010-01-26 00:27:02

标签: mercurial mercurial-queue

如果我一直在编写代码并忘记创建补丁系列,我该怎么回顾性地创建补丁系列?到目前为止,唯一想到的是:

# Prepare and test the first batch of changes.
$ hg qrecord -m 'first batch' 1.patch
$ hg qnew -m 'stash downstream changes' stash-1.patch
$ hg qdelete -k temp-1.patch
$ make hello
cc     hello.c   -o hello
hello.c: In function ‘main’:
hello.c:4: error: syntax error at end of input
make: *** [hello] Error 1
$ echo '}' >> hello.c
$ make hello
cc     hello.c   -o hello
$ hg qrefresh

# Recover the stashed changes.
$ patch -p1 < .hg/patches/last.patch

# And around we go again!
$ hg qrecord -m 'second batch' 2.patch
$ hg qnew -m 'stash downstream changes' stash-2.patch
$ hg qdelete -k stash-2.patch
$ make hello
...

这种非常麻烦的方法也很危险。我可能会忘记-k上的qdelete,此时我会将我的前额撞到砖墙上几分钟,或者在qrecord操作过程中我可能会包含太多或太少。

有更好的方法吗?

(我真正想要的是能够在我想要拆分的补丁之前hg qpop,并使用当前不存在的命令hg qunrecord来交互式地吸收更改修补程序进入我的工作目录。一旦我对这些更改感到满意,hg qnew -f可能会在旧版本面前挤出一个新补丁。)

5 个答案:

答案 0 :(得分:6)

MQTutorial解释了如何拆分补丁。因此,您可以从当前工作中创建补丁并将其拆分为多个补丁。

答案 1 :(得分:2)

我认为crecord extension会让你这样做。它为您提供了一个基于交互式curses的界面,您可以在其中准确选择提交中的内容。

答案 2 :(得分:2)

TortoiseHg在“提交”对话框中具有非常有用的功能“Hunk Selection”,用于此类工作:
http://tortoisehg.bitbucket.io/manual/2.0/commit.html#change-selection

答案 3 :(得分:1)

启用内置扩展程序:

[extensions]
mq=
record=
shelve=

然后将MQ移动到工作树中并拆分更改并删除原始补丁:

$ hg qpop my.patch
$ patch -p1 <.hg/patches/my.patch

$ hg qnew -i my1.patch
 ....
$ hg qnew -i my2.patch
 ....
$ hg qnew myN.patch   # last without interactive stuff

$ hg qdelete --keep my.patch

my$i.patchmy$((i+1)).patch之间,您可以使用hg shelve / hg unshelve来测试项目是否构建并在my$i.patch之上传递测试而不需要稍后更改!< / p>

如果您发现此阶段缺少某些内容,请对搁置的更改使用hg qref,或对未经保留的更改使用hg qref -i

另见Mercurial: move MQ patch to shelve?

答案 4 :(得分:0)

首先,安装crecord,因为它只是一种更好的分割方式。

$ hg qcrecord part1
$ hg qnew part2 # ok, slightly a lie at this point
$ hg qpop
$ echo "}" >> hello.c
$ hg qrefresh
$ hg qpush
$ hg qcrefresh # Keep just what you want in part2
$ ...

这里对crecord唯一特别的是qcrefresh命令。如果您不是诅咒粉丝,您仍然可以在此处执行所有相同的操作,只需将qcrefresh替换为hg qrefresh -X 're:.'即可。如果您愿意,可以hg qrefresh -I aauuuuuggghhh。 (它是你的&#34;取消承诺&#34;使用-X或-I。)