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
для этого? Спасибо.
Ответы
Ответ 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