分散バージョン管理システム「Mercurial」

ferris wheel


個人的にSubversionも随分飽きてきた使えるようになったので、最近違うSCMを触り始めています。

その名も『Mercurial』。Python製の分散型のバージョン管理システムです。


ちなみに、このMercurialですが、XenやMozilla、OpenSolarisのバージョン管理システムとして採用されています。
# 結構、大物たちですよね。

分散型と中央集中型

Mercurialの特徴は何度も単語が出てきていますが、分散型ということです。
一方、CVSやSubversionは中央集中型と呼ばれ、マスタリポジトリ1つと、各人のローカルに作業コピーを持つモデルですが、分散型のモデルでは、ローカルリポジトリとリモートリポジトリという概念が存在します。


とはいっても、別に難しい話ではなくて、作業コピーそのもののバージョン管理ができるローカルリポジトリがあって、リモートにマスタリポジトリが存在する(この概念は中央集中型と一緒ですね)というだけの話です。

Mercurialの特徴とか感想

で、分散型と中央集中型の話は、これくらいにして、このMercurialを使うと何が嬉しいのか。
っつー点なんですが、

  • ローカルにリポジトリを持てるため、オフライン(マスタリポジトリにアクセスできなくても)でも開発を進めることが出来る。
  • シンプルな構造なので、操作が高速。インストールもちょっぱや。
  • 標準でWebインターフェースが付属
  • Python製なので、Pythonからがっつりコントロールできる(らしい)


などなど。(もっと、なんかありそうだけど。)


1つ目については、Subversionでもsvkを入れれば、同様のことは実現できますが、やはりインストールまで時間がかかったり(Subversion系はmakeに時間かかりすぎ)とか、処理速度の面では、Mercurialに軍配が上がるように思います。


ローカルリポジトリでバージョン管理しながら、オフラインで開発を進めて、オンラインになったときに、まとめてマスタリポジトリにコミットする、なんてことが可能になります。
Mercurialでは「ローカルリポジトリは、個人用のブランチである」的な考えだそうです。なるほど。


処理も、かなり軽い感じで、コミットも軽快に行えました。(試したときは、管理ファイル数が少なかったり、リビジョンも進んでなかったというのもあると思いますが。)
Subversionとかだと、まずローカルにチェックアウト(リポジトリと同期)するかと思いますが、Mercurialでもそれは変わりません(チェックアウトとは呼びませんが)。
ただ、ローカルに出来るのが作業コピーではなくリポジトリが生成されるといったイメージです。
で、そのリポジトリを直接触るって感じですかね。

もちろん、そのディレクトリ内部でメタデータを保持していて、版管理を命令に応じてしてくれているといった感じです。


あと、インストールがちょっぱやな件ですが、私が試した環境(Linux)にはPythonが既にインストールされていたので、インストールは1分程で終わりました。

$ wget http://www.selenic.com/mercurial/release/mercurial-0.9.5.tar.gz
$ tar zxvf mercurial-0.9.5.tar.gz
$ cd mercurial-0.9.5
$ sudo python setup.py install --prefix=/usr/local

だけです。
Debianを利用しているなら、aptでもパッケージングされています。(ちょっとバージョン古いけど。)
以下のコマンド一発で終わりそうです。

# apt-get install mercurial


あと、Webインターフェースも便利ですね。RSSも吐いてくれるようだし。
こんな画面で見ることが出来ます。(例えば↓こんなの)

http://www.lalalila.org/repos/


最後に、さすがPython製っつーか、Tracのプラグインもちゃんとあるみたいですよ。ご参考まで。

http://trac.edgewall.org/wiki/TracMercurial

ということで

がっつり、バージョン管理するなら、Subversionで良いと思います。安定もしていますしね。
でも、これから環境作って、ちょろっと開発したいだけなんだよー、的な方に如何でしょうか。
お手軽に共有リポジトリが作れますよ。すごく便利だと思います。


あと、個人的には、こういう分散型リポジトリの仕組みが、拠点開発とか遠隔地との開発時に、うまく活用できないかしら、なんて考えています。
まだ答えはないですけど。