Mercurial の phase で少しつまづいたこと。
Mercurial *1 を俺俺環境で使っていた時に少しつまづいたのでメモ。
ちょっとしたことで MQ を使おうと思ったのだけど、いじるチェンジセットがかなり多かったため、一旦 clone して clone 先のリポジトリでお試しすることにした。
で、clone 先リポジトリで qimport したところ下記のようなエラーになった。
$ hg qimport -r 8184 abort: revision 8184 is not mutable (See "hg help phases" for details)
「phase ってなんだろう?」と思いつつ hg -v help phases したり Phases - Mercurial を読んだところ、「該当チェンジセットが公開設定 (phase が public) だからだっつーの。ちゃんと嫁」と書いてあった。
$ hg phase -r 8184 8184: public
確認してみると確かに public なのだけど、デフォルトでは draft なチェンジセットをわざわざ public に変更した記憶がない…
なんとなく思い立って clone 元リポジトリで phase を確認してみると、下記のようにちゃんと draft になっているし、qimport も出来る。
$ hg phase -r 8184 8184: draft $ hg qimport -r 8184 $ hg qseries 8184.diff
おかしいと思いつつ改めて Phases - Mercurial を読むと、「2. Available Phases」にしっかりと書いてあった (汗)
but automatic movement from draft to public can happen on transferring changesets between clones.
Phases - Mercurial
clone すると draft から public に自動的に移行するのだけど、clone されたチェンジセットは恒久的なものであるべきだから、この動作には納得できる。
しかし、今回のようなケースでは困る。使い方を間違っていると言われればそれまでだけど…
なのでもう少しちゃんと読んでみた。
「5. Publishing Repository」によるとリポジトリはデフォルトで『公開』になるのだけど、当該リポジトリの hgrc に下記のように記述すれば『非公開』に設定出来る。
非公開にしたリポジトリを clone しても draft は draft のままコピーされるので、今回のようなケースにも対応できる。
[phases] publish = False
対策
自分しか使わないようなリポジトリをバックアップ (あるいは類する操作) する場合は、clone コマンドではなく OS のコピー機能を使ったほうが良さそう。
あるいは、当該リポジトリの hgrc にて非公開リポジトリ設定する *2
結論
ドキュメントちゃんと嫁。
参考
phase については下記が詳しいので、目を通しておくと吉。