2011/03/01 [火]
Mercurial Queue 拡張、MQ は、以下のような状況時に使用すると、大きな効果を発揮します。
- 元倉庫内容が頻繁に更新されるが時間のかかる追加機能を作成しているとき
- 元倉庫内容とは異なった独自機能を手元の環境のみで再現しているとき
MQ を使用可能にすると、切れ端(patch)のスタックが使用可能になります。 切れ端には名前をつけることができ、任意の段階で新しい切れ端を作ることが出来ます。それらはスタックで管理され、継ぎ当てた切れ端、まだ継ぎ当てられていない切れ端に別れ、その間は最上段となります。この最上段をqpush/qpopで動かし、スタックの順序順に、作業場に継ぎ当てたり、元に戻すことができます。
今、よその倉庫内容が手元の倉庫に複製されていて、その内容が作業場に展開、その後自分で各種修正した状態であるとします。 そして、よその倉庫で新しい版が公開され、手元環境を更新するものとします。 この場合、MQ を使うと次のように簡単に更新することができます。
- 手元環境の変更内容を切れ端にする(qrefresh/qnew)
- 手元環境に継ぎ当てられた切れ端を全て解除する(qpop -a)。スタックには、解除された全ての切れ端の情報が残っている。
- これで、作業場は倉庫から展開された内容そのもの=よその倉庫から持ってきた内容と同一になっている。
- よその倉庫から更新内容を持ってきて、手元の倉庫を更新する。(pull)
- その内容で作業場に更新する。(co)
- 再びスタックから切れ端を継ぎ当てる(qpush -a)
各切れ端は、継ぎ当てられると、それ自身が Mercurial の一つの変更集合に対応します。切れ端を qrefresh で更新しても、Mercurial の変更集合の改訂番号は変わらず、その 変更集合ID だけが変化します。qpush/qpop で、この変更集合を追加したり、除去したりできます。
MQ は、誰かが pull する可能性のある倉庫では使用すべきではありません。
MQ は標準搭載されていますが、有効化されていません。そのため、.hgrc に以下のような記述を追加して拡張を有効化する必要があります。
[extensions] mq=
by seclan