2010-01-26 49 views
10

如果我一直在编写代码并忘了创建补丁系列,我该如何创建补丁系列回顾?到目前为止唯一想到的是:如何将工作分成多个具有mercurial队列的修补程序?

# 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 
... 

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

有没有更好的方法?

(我真的很希望能够在hg qpop之前,在我想分割的补丁之前,使用一个当前不存在的命令hg qunrecord交互式地将修补程序从修补程序中吸收到我的工作目录中。一旦我对这些变化感到满意,hg qnew -f可能会在旧的前面挤出一个新的补丁。)

+0

这是关于按文件分成不同的补丁的问题吗? IE浏览器。给定文件的更改不会跨多个修补程序分割。因为如果是这样,你可以做得比你上面描述的方法更好。这是一个古老的问题,但仍然是一个相关问题。 – 2013-08-19 09:07:04

+0

@FaheemMitha:我在一段时间之前转向git,所以它与我无关。但是为了记录,我确实想要区分文件中的更改,特别是通常包含多个不相关的文件添加/删除的顶级项目文件。事实上,这几乎是常态而非例外。 – 2013-08-20 03:18:42

+0

好的。感谢您的反馈,Marcelo。 – 2013-08-20 16:27:20

回答

6

MQTutorial解释如何分割补丁。所以你可以从你当前的工作中创建一个补丁,并将它分成几个补丁。

+0

谢谢。这不是一个理想的解决方案,但它比迄今为止我所做的要好得多。 – 2010-02-01 12:51:38

+3

我通常会做的是使用两个存储库和一个不错的可视化比较工具,比如Beyond Compare。使用本教程中的名称,我从应用OP的repo A开始,并将A克隆到B.然后在AI'qpop -a'中,比较A和B,樱桃选择P1的更改以从B复制到A ,'qnew -f P1',然后复制其余的'qnew -f P2'。 – 2010-09-16 02:33:13

2

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

+0

基于粗略阅读,crecord似乎是一个基于curses的等效记录扩展。谢谢你指出这个扩展名,因为它看起来非常方便。但是,似乎并没有减少我必须执行的步骤数量;它只是让第一步更愉快。 – 2010-01-27 01:28:57

+1

@MarceloCantos,qcrecord确实减少了步骤。而qrecord几乎总是告诉我“无法编辑整个文件的补丁”,qcrecord高兴地让我排除我的补丁中的任意hunk和线。 – 2013-07-25 03:14:46

2

TortoiseHg具有非常实用的功能“猛男选择”在提交对话框,那种这项工作:
http://tortoisehg.bitbucket.io/manual/2.0/commit.html#change-selection

+0

我的大部分工作都不在Windows中,但我偶尔会使用它,所以非常感谢您的提示。不幸的是,正如@ RyanWilcox的建议,这似乎有助于我的过程中的第一步,而不是简化整个过程。 – 2010-01-27 01:33:17

+2

供参考:如果需要,您可以在Linux和Mac OS上运行TortoiseHg :) http://bitbucket.org/tortoisehg/stable/wiki/install – kuy 2010-01-27 22:09:29

+0

我不知道!很高兴知道。 – 2010-02-01 12:52:11

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之上的测试而不需稍后更改!

如果您发现此阶段缺少的东西使用hg qref搁置的更改或hg qref -i未搁置的更改!

又见Mercurial: move MQ patch to shelve?

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命令。如果你不是一个诅咒迷,你仍然可以在这里做所有相同的事情,只需用hg qrefresh -X 're:.'替换qcrefresh即可。或者hg qrefresh -I aauuuuuggghhh,如果你愿意的话。 (这是你的“uncommit”使用-X或-I。)

相关问题