読者です 読者をやめる 読者になる 読者になる

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

結論

ドキュメントちゃんと嫁。

*1:version 2.1.1 だったと思う。phase が導入された 2.1 以降ならたぶん同じようになるはず

*2:こういう使い方をするものなのかは自信なし