Mercurial - работа с очередями, похожими на полки? - PullRequest
12 голосов
/ 31 октября 2011

Я недавно начал работать с 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. К этому моменту я хотел бы вернуться к работе над исправлением ошибок и отложить в сторону работу функции. Я думал, что это так просто, как:

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 ]

10 голосов
/ 31 октября 2011

Вы можете использовать охранников .Они позволяют вам поддерживать порядок исправлений, не переставляя файл 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, который будет отображать охрану, связанную с каждым патчем.

9 голосов
/ 31 октября 2011
  1. Выполнить hg qpop -a, чтобы удалить все патчи из стека
  2. Выполнить hg qpush --move some-patch, чтобы применить «some-patch» без применения каких-либо других патчей перед тем, как он будет в стеке патчей
4 голосов
/ 31 октября 2011

Нет, вы ничего не упускаете.Расширение mq делает довольно сильное предположение, что очереди исправлений являются линейными.Если вы собираетесь создавать функции / исправления с несколькими исправлениями, тогда qqueue будет работать ... Но если ваши функции / исправления представляют собой просто отдельные исправления, и вы хотите иметь возможность применять одно без применения других, это может быть прощепросто переставить .hg/patches/series (в котором хранится порядок применения исправлений).

Я делаю это (и исправления вручную) достаточно, чтобы получить псевдоним оболочки:

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