2010年12月27日月曜日

SVNからMercurialに移行するべき8つの理由

このエントリーをはてなブックマークに追加
Clip to Evernote
Pocket

Git、Mercurial、Bazaarはオープンソースの分散バージョン管理システムで、どれも人気がある。特にGitとMercurialはもともとはLinux Kernelの開発のために作られた歴史からしても、ライバルと言える関係だ。LinuxやAndroid OSではGitが採用されたが、MercurialもOpenJDKやNetBeans、Xen、Python等で採用されている。

SVNから分散バージョン管理システムに移行を検討している所は多い。日本だと濱野氏がGitのメンテナをやっているせいかGitに人気が集中しているようだ。しかし気軽に分散バージョン管理システムを導入したいソフトウェア開発チームには、あえてMercurialを勧めたい。

1. SVNからMercurialに移行するべき8つの理由

取り扱いが楽で、今すぐ移行できる事がMercurialを導入するべき理由だが、もう少し詳細に説明すると以下のようになる。

1.1. 分散型である
以下は典型的な運用における集中型と、分散型バージョン管理システムの概念図だ。
集中型バージョン管理システムは一つのリポジトリを多人数が共有するが、分散型は各人が自分のリポジトリを利用しており、必要に応じて他のリポジトリと変更点を反映しあう。この違いが分散型に以下のようなアドバンテージをもたらす。
1.1.1. 他のPGと独立して作業がしやすい
派生バージョンをローカル・リポジトリに作成でき、バージョン管理ができる。周囲に影響を与えずに開発を進め、まとまった所でコミット履歴ごと、共有リポジトリに反映する事ができる。
1.1.2. 操作ミスを取り消しやすい
SVN等の集中型ではコミットしたら終わりだが、分散型はローカル・リポジトリにある間であればコミット履歴を取り消す事は比較的容易。さらに、実験的なコードは、共有リポジトリに反映しなくても良い。
1.1.3. 耐障害性に優れている
開発チームの持つローカル・リポジトリが全てバックアップとなる。10人のプログラマーがいれば、恐らく11台のPCにリポジトリが拡散する。これはRAIDやクラスタリングよりも強い冗長性を持つ事になる。
1.2. ユーティリティが豊富
TortoiseSVNの姉妹品TortoiseHgが安定して動く。最近のバージョンはMercurialもセットで配布され、インストールも簡単になっている。今すぐグラフィックス・デザイナー等に利用を推奨できるのは利点だ。Macintosh OS X用にはMacHgがある。
IDEは、EclipseやNetBeans、VisualStudioでも利用する事ができる。GitのEclipseプラグインEGitは、まだ開発初期段階だ。また移植性に優れ、Windows、Macintosh、LinuxのどのOSでも動作させることができる。
やや古いバージョンだが、NetBeansからMercurialを利用すると以下のようになる。IDEに統合されており、コマンドラインを意識しないで使える事が分かるはずだ。
TracやRedMineなどのチケット管理システムでも利用する事ができる。
1.3. 保守運用が楽
集中型に比べてバックアップが容易な上に、運用面での長所も存在する。
1.3.1. バックアップが容易
リポジトリのクローンを作ればバックアップになるが、クローン作成が容易なだけではなく、hg-pullするだけで同期も簡単に取ることができる。
1.3.2. 有力なホスティング事業者
Google CodeBitbucketがホスティング・サービスを提供しており、必ずしも共有リポジトリを管理する必要が無い。
1.3.3. ビルトインのhttpサービス
セキュリティ的には弱いが、ビルトインされたhg serverコマンドでサービスを起動し、LAN内などで簡単に共有リポジトリを準備することができる。またリポジトリの状態も見られるので、ソースコードの分岐状態の確認にも使える。
1.3.4. 共有リポジトリを作るのが楽
Gitで共有リポジトリを作る場合、Linuxのユーザー権限管理に依存しているため、以下のような初期化オプションが必要だが、Mercurialでは不要になっている。
git init --bare --shared=group
1.3.5. メンテナンス・コマンドが不要
Gitの場合は、git-gcを行い、リポジトリ内のオブジェクトの圧縮や不要なオブジェクトの破棄を行わないと、ディスク容量を不必要に占める問題があるが、Mercurialには無い。
1.4. ブランチの管理が明快単純
Mercurialは、無名ブランチと言って各コミット(changeset)の親子関係だけが履歴の管理単位となる。目印としてtagとbookmark、そしてMercurialの意味でのbranchをchangesetに付与する事ができるが、Gitのbranchとstashに該当する機能は無い。シンプルで明快な履歴管理となる。
無名ブランチは、あるchangesetに戻って(hg-checkout/hg-update)変更をcommitするだけで、自動的に作る事ができる。Gitでは、reset後にcommitした場合は変更履歴は廃棄されるため、明示的にbranchを作成する必要があるが、Mercurialでは無い。
SVNのブランチの様にTruncとBlanchを分ける場合は、リポジトリを別に分ける事になる。SVNのブランチも有効に使っていない開発チームも少なくない。分岐バージョンはリポジトリを分けると言うのは、シンプルで分かりやすい方法だ。しかし、ブランチ間の関係を示す情報が失われるため、2-way mergeをせざるをえなくなる。GitやMercurialが使う3-way mergeに比較して、SVNの2-way mergeは衝突を起こしやすい
1.5. 他のバージョン管理システムから移行できる
Convert extensionがあって、Bazaar、CVS、Darcs、RCS、SubversionのリポジトリをMercurialに移行することができる。新規プロジェクトでなくても、Mercurialを使い始める事が可能だ。
1.6. 意外に速く、ディスク容量を食わない
Mercurialはスクリプト言語のPythonで書かれているが、実行速度は比較的速いとされる。また、管理単位が差分(changeset)になっているため、Gitと比較するとディスク容量が節約されている。近年のハードウェア事情をから考えれば大きな問題では無いが、サイズは小さい方が取り回しが楽なのも確かだ。
1.7. 日本語ドキュメントがある
他に比べて利点になるわけではないが、必要条件になる場合も多い。MercurialにはオンラインでチュートリアルFAQがある。これらにざっと目を通せば、何となく使い方が分かるだろう。
1.8. 高度なこともできる
Rebase、Bisect、MQ等の高度な機能も利用する事ができ、Pythonでモジュールを作成する事も可能だ。当初はGitの方が高機能とされていたが、その差は縮まっている。気軽にMercurialを導入した開発チームでも、使い込んでいくうちに、これらのメリットに気づくことはあるだろう。

2. 日本語ファイル名の問題

上述したように高機能なMercurialだが、日本語ファイル名の取り扱いは、まだ十分に出来ていない(コミット・メッセージは日本語は問題ない)。

Mercurialはファイル名の文字コードを原則として変更しないため、MS-Windows環境下での日本語ファイル名に¥(0x5c)が含まれる場合や、WindowsとLinuxでのリポジトリの共有をするときに問題が発生する。

回避策としては、(1)日本語ファイル名を用いない、(2)拡張機能win32mbcsで0x5c問題を回避するぐらいしか無く、現状では有効な解決策は無いようだ。

3. GitとMercurialの比較

内部構造としては、ファイルの全体を圧縮して保存・管理するのか、ファイルの差分を圧縮して保存・管理するのかという違いがあるが、実際には開発者の向いている方向の差が大きいように感じる。

つまり、GitはLinuxという大規模プロジェクトへの適用が基本となっており、Linux上での効率化が念頭におかれているように感じる。例えば、C言語とPerl/シェルスクリプトの構成になっており、ファイルの属性もLinuxを前提としている。これはLinuxでは標準的な構成だが、MS-Windowsへは移植性が低くなる。逆にMercurialはPythonとC言語で書かれたバイナリdiffの構成であり、プラットフォーム依存性が低い。また、ユーザー定義ファイル名が . で始まらなくても良いなど、MS-Windows環境での利用も意識している。2009年にGoogle CodeでMercurialを採用し、Gitのサポートを見送ったのも、MS-Windows環境への適応性が一つの理由であった(@IT)。

4. 使うと分かる気軽な利便性

集中型と分散型では、圧倒的に後者の方が気楽に使える。その差に比較すれば、GitとMercurialの違いなどは誤差の範囲でしかないであろう。個人的な印象ではあるが、GitやMercurialを使い始めた人は分散型バージョン管理システムの愛好者になる確率が高い。

便利さは説明してもなかなか伝わらない所ではあるので、まずは使用してみる事をお勧めする。とりあえずはチュートリアルを試してみるだけで十分だ。それが終わったら、すぐに分散型の手軽さが分かってもらえるはずだ。

0 コメント:

コメントを投稿