Ответ 1
MQTutorial объясняет, как разбить патчи. Таким образом, вы можете создать патч из текущей работы и разбить его на несколько патчей.
Если я некоторое время отвлекаюсь на код и забыл создать серию патчей, как я иду, как мне создать серию патчей ретроспективно? Пока что единственное, что приходит в голову:
# 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
, после чего я буду bash лоб на кирпичную стену в течение нескольких минут, или я могу включить слишком много или слишком мало во время операции qrecord.
Есть ли лучший способ?
(Мне бы очень хотелось, чтобы я мог hg qpop
как раз перед тем патчем, который я хочу разбить, и использую в настоящее время несуществующую команду hg qunrecord
, чтобы в интерактивном режиме высасывать изменения из патча в мой рабочий каталог. Как только я доволен изменениями, hg qnew -f
может сжать новый патч перед старым.)
MQTutorial объясняет, как разбить патчи. Таким образом, вы можете создать патч из текущей работы и разбить его на несколько патчей.
Я думаю, что расширение crecord позволит вам это сделать. Он дает вам интерактивный интерфейс на основе проклятий, где вы можете точно выбрать, что в коммите.
TortoiseHg имеет очень полезную функцию "Выбор Hunk" в диалоговом окне Commit для этой работы:
http://tortoisehg.bitbucket.io/manual/2.0/commit.html#change-selection
Включить встроенные расширения:
[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 на полку?
Во-первых, установите 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
, если хотите. (Это ваш "uncommit" с использованием -X или -I.)