Как разделить работу на несколько патчей с ртутными очередями? - PullRequest
10 голосов
/ 26 января 2010

Если я какое-то время работал над кодом и забыл создать серию патчей по ходу дела, как я могу создать серию патчей ретроспективно? Пока что единственное, что приходит на ум, это:

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

6 голосов
/ 31 января 2010

MQTutorial объясняет, как разделять патчи.Таким образом, вы можете создать патч из вашей текущей работы и разбить его на несколько патчей.

2 голосов
/ 26 января 2010

TortoiseHg имеет очень полезную функцию «Выбор куска» в диалоге фиксации для вида этой работы:
http://tortoisehg.bitbucket.io/manual/2.0/commit.html#change-selection

2 голосов
/ 26 января 2010

Думаю, расширение crecord позволит вам сделать это. Он предоставляет вам интерактивный интерфейс на основе curses, где вы можете точно выбрать, что находится в коммите.

1 голос
/ 08 января 2015

Включить встроенные расширения:

[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.patch и my$((i+1)).patch вы можете использовать hg shelve / hg unshelve, чтобы проверить, построен ли проект, и пройти тестирование поверх my$i.patch без последующих изменений!

Если вы обнаружите, что на этом этапе чего-то не хватает, используйте hg qref для отложенных изменений или hg qref -i для несохраненных изменений!

См. Также Mercurial: переместить патч MQ на полку?

0 голосов
/ 29 октября 2015

Во-первых, установите 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. Если вы не являетесь поклонником curses, вы все равно можете делать все то же самое, просто заменив qcrefresh на hg qrefresh -X 're:.' Или hg qrefresh -I aauuuuuggghhh, если вы предпочитаете. (Это ваш "uncommit", используя -X или -I.)

...