Подтвердить что ты не робот

Mercurial - Работа с очередями похожа на полки?

Недавно я начал работать с MQ, так как мне нравится идея работать над изолированными патчами и совершать транзакции, не затрагивая репо, пока набор изменений не будет достаточно доработан. До этого я работал с продлением Mercurial shelves, но обнаружил, что он немного нестабилен. То, что я все еще пытаюсь выяснить в 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 для этого? Спасибо.

4b9b3361

Ответ 1

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

На этом этапе вы находитесь в ситуации, когда patch 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, в котором будут отображаться защитники, связанные с каждым патчем.

Ответ 2

  • Выполнить hg qpop -a, чтобы удалить все патчи из стека
  • Выполнить hg qpush --move some-patch, чтобы применить "some-patch" без применения каких-либо других патчей к нему в стеке патчей

Ответ 3

Нет, вы ничего не пропустили. Расширение 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