Mercurial に移行


分散型バージョン管理システムに移行するなら日本語ファイル名も上手に扱ってくれる Bazaar だとずっと考えていたのですが,プラグインの日本語扱いがファイル名に限らず微妙なのと,そもそも日本語ファイル名をそんなに扱うこともないという考えから Mercurial に移行してみました。以前試したときは TortoiseHg は 64-bit Explorer からコンテキストメニューで操作できなかったのですが,最新バージョンでは対応しているようです[A]

手順としては以下のような感じになりました。

  1. Mercurial のインストール
  2. リポジトリの変換
  3. Apache の公開設定
  4. SSH サーバーの設定
  5. クライアントの設定

以下に詳細を記します。

Mercurial のインストール

とりあえずインストールです。 Python で実装されているだけあって easy_install で簡単にインストールできます[B]

# easy_install で Mercurial をインストールするためのパッケージを導入。
sudo aptitude install python-dev python-setuptools
sudo easy_install -U mercurial

リポジトリの変換

既存の Subversion リポジトリを Mercurial リポジトリに変換します。結論から述べますと,この項目は失敗しており不完全です。

さて,リポジトリオリジナルを変換しなくても扱えるらしいのですが,今までのリポジトリ構成だと 1 つのリポジトリにいろいろ入っていてごちゃごちゃしていました。分散型には向かないと思ったので整理の意味も込めて行いました。

リポジトリの変換はデフォルトで付属の convert extension を用いることで簡単に行うことができます。ホームディレクトリ直下の .hgrc ファイルに以下の行を追加します。

[extensions]
hgext.convert =

これで hg convert が使えるようになりましたので,リポジトリの変換を行います。

リポジトリが trunk/branches/tags の構造を持っている場合は以下の方法で変換できます。

hg convert --config convert.svn.trunk=path/to/trunk --config convert.svn.branches=path/to/branches --config convert.svn.tags=path/to/tags file:///path/to/svn_repos hg_repos

もし branches, tags がなければ trunk だけオプション指定すればよいです。

しかし私が行ったときは tags の変換がうまく行われませんでした。一応回避策もあるようなのですが[C],妥協して tag を諦めました。あまり tag からブランチ切ることがないので。

Apache の公開設定

Mercurial は hg serve コマンドがあってサーバーとして動かすことができますが, Apache でまとめて設定した方が楽です。 hgweb.cgi と hgwebdir.cgi の 2 種類の CGI スクリプトが用意されており,前者は単一のリポジトリ用で後者は複数用です。

ここは設定が多様なので委細は省きます。 PublishingRepositories にしたがって進めていけば OK です。

CGI の設定ファイルである hgweb.config ですがウェブ上に公開されないように,公開ディレクトリ以外の場所に置いた方がよいでしょう。したがって, hgwebdir.cgi の最後の方にある hgweb.config を指定する行は修正するべきでしょう。

#application = hgwebdir('hgweb.config')
application = hgwebdir('/path/to/hgweb.config')  # 相対パスでも可。

もし HTTP や HTTPS で push したいなら,リポジトリを www-data ユーザーが書き込める必要があります。オススメはしませんが, HTTP で push するには hgweb.config もしくはリポジトリ内の .hg/hgrc で web セクションの push_sslfalse に指定する必要があります[D]

[web]
push_ssl = false

SSH サーバーの設定

さてこれまでの設定でサーバー上のリポジトリに HTTPS で push はできるのですが, Mercurial がクライアント認証に対応していないようなので, SSH で push するようにしました。それに非公開リポジトリにアクセスする場合も必要になります[E]

まずはリポジトリ操作用の専用ユーザーを作成します。 SSH でのリポジトリの URI は ssh://hg@hostname//path/to/repos のように絶対パス指定もしくは ssh://hg@hostname/path/to/repos ような相対パス指定になります。相対パス指定の場合,ホームディレクトリが起点となります (例の場合だと $HOME/path/to/repos)。そのためホームディレクトリをリポジトリのあるディレクトリに指定すると URI が簡単になります。

groupadd hg
useradd -g hg -d /path/to/root/of/repositories hg

Apache の場合は www-data ユーザーが読み可能である必要がありましたが,こちらは専用ユーザーが読み書きできる必要があります。両立させたい場合はグループを適切に設定する必要がありますが,普通はそんな必要はないように思います。

パスワード方式の場合は必要ありませんが,鍵交換方式の場合は公開鍵を ~/.ssh/authorized_keys に追加します。これで SSH で Mercurial リポジトリに push できるようになります。

ちなみに TortoiseHg を用いて SSH 鍵交換方式通信を行うには PuTTY の Pageant を起動しておく必要があります。 pageant.exe は TortoiseHg に付属していますが,鍵を生成するための PuTTYgen (puttygen.exe) は付属していません。

クライアントの設定

TortoiseHg

日本語ファイル名のファイルは扱っていないと思っていたのですが,実は存在していました。これをこのまま TortoiseHg で clone しようとするとエラーが起こりました。これは Subversion がファイル名を UTF-8 で扱っていたのに対して TortoiseHg が無理やり CP932 に変換しようとしていたからです。これをうまく扱ってくれるように FixUtf8 Extension を導入します。これは標準付属ではないのでダウンロードする必要があります。

ホームフォルダに mercurial.ini というファイルがあります。これは Linux でいうところの .hgrc に相当するもので,同じ書式で拡張を追加できます。

[extensions]
fixutf8 = X:\path\to\fixutf8.py

これですでにリポジトリ上にあった日本語のファイルも正しく clone できるようになりました。しかし FixUtf8 Extension があると TortoiseHg で日本語のファイル名がコミットできないみたいです[F]

その他のツール

たくさんあります。 Visual Studio のプラグインもあるのですが,実はこれも大きな決め手の一つでした。

おわりに

tag がなくなるという問題が生じましたが,基本的には移行することができました。まだほとんど使っていないような状況なのでこれから問題がさらに出てくるかもしれません。

脚注

  1. explorer.exe /separate とすれば使えましたが (64ビット版 Windows Vista で右クリックメニューを動かすにはどうすればいいですか?)。 []
  2. Download - Mercurial []
  3. Mercurial の Subversion convert extension []
  4. hgrc []
  5. 一応 hgrc の設定に hidden というインデックスに表示しないオプションがあります。 []
  6. TortoiseHg で日本語ファイル名 []