今回は,対象の構成管理がMercurialであるか否かに関わり無く,Mercurialを併用することで開発効率を向上させる手法を説明します。
題材としてフリーソフト/オープンソースソフトを取り上げますが,ここで説明する手法は,「Mercurial以外の構成管理ツールの使用を指定されている開発」といった,(残念ながら)良くあるシチュエーションでも適用可能です。
なお本稿では,フリーソフト/オープンソースソフトの総称として,以降FLOSS(Free/Libre and Open Source Software)の略称を使用します。
No Patch, No Life
世間的にFLOSSが認知されて随分時間も経ちましたし,その数も相当なものになりました。
その気になれば,CVSやSubversionで運用されているリポジトリにアクセスして,最新成果をいち早く試してみることも,これまでの開発過程の記録を参照することも容易にできます。
しかし,折角ソースコードが手元にあっても,CVSやSubversionのような中央集約形式の構成管理ツールの場合,いざこれらFLOSSのソースに独自の変更を加えようとすると,以下のような問題が発生します。
- コミット権限が無いので,自分の作業を記録できない
- その場限りの変更なら問題ありませんが,継続的に変更作業を実施する=ある程度の規模の変更を行う場合,「変更」そのものの構成管理ができないのは致命的です。
- 新しい版が出た際に,独自の変更分の反映が面倒
FLOSSの場合,比較的短期間でバグが修正された新しい版がリリースされることが多々あります。
折角新しい版で品質が向上していても,独自変更部分は構成管理されていませんので,新しい版に対して適用するのは非常に面倒です。
結局のところ,こと構成管理に限って言えば,圧倒的に利用者の立場が弱いといえます。
「独自の変更」という言い方をすると:
今時のFLOSSは,特に改変しなくても十分使えるでしょ?
と考える方もいることでしょう。
しかし,「独自の変更」は必ずしも特定用途(e.g.:特殊な環境・デバイス・設定での使用等)向けの専売特許ではありません。折角のソースファイル公開なのですから:
- プログラミングの学習の際の,コメント付与や改変実施
- 問題解析のための,ログ出力追加
といったことをやらない手はありません。
リポジトリのハイブリッド化
まずはCVSなりSubversionを使用して,対象の成果物を「チェックアウト」し,続いて成果物をチェックアウトしたディレクトリをMercurialのリポジトリとするために,"hg init"を実行します。
これでこのディレクトリは,Mercurialのリポジトリでありながら,他の構成管理ツール(CVS等)の管理下にもあることになります。一種のハイブリッド(混成)リポジトリと言っても良いでしょう。
しかし,この時点ではまだ単に「Mercurialのリポジトリである」というだけで,Mercurial側では何も管理していない状態ですので,チェックアウトした成果物を初期バージョンとしてMercurialに登録します。
まずはCVSやSubversionの管理情報格納ファイルを無視するために,以下のような".hgignore"ファイルを記述します。
syntax: re
# CVS との併用の場合
^CVS/
/CVS/
# Subversion との併用の場合
^\.svn/
/\.svn/
".hgignore"ファイルは,ワーキングディレクトリの最上位ディレクトリに配置します(それ以外の場所では機能しません)。「ワーキングディレクトリの最上位ディレクトリ」は"hg root"が表示するディレクトリです。
上記以外にも,以下のような設定が有用でしょう。
syntax: glob
# Emacs のバックアップファイル
*~
# C/C++ のオブジェクトファイル
*.o
# Java のクラスファイル
*.class
"syntax: re"や"syntax: glob"は,指定した無視対象パターンの文法を指定するもので,"re"は正規表現(regular expression)の,"glob"はシェル形式のパターンマッチングを意味します。
後は"hg add"によってファイルを登録するのですが,今回のようなケースでは,"-A"オプション付きの"hg commit"を使用するのが便利です。
"hg commit"に"-A"オプションを指定することで,以下の点で無指定の場合と振る舞いが変化します。
- 未知のファイルの追加:
- "hg status"で"?"表示されるファイルに対して,"hg add"が指定されたものとして振舞います。
- 見失ったファイルの除外:
- "hg status"で"!"表示されるファイルに対して,"hg remove"が指定されたものとして振舞います。

