フリーなバージョン管理システム 2007 年半ばの時点で私が把握しているオープンソースのバージョン管理システムは、 これらがすべてです (その後、2011 年後半にいくつか追加しました)。 このうち、私が常用しているのは Subversion と Git で、 それ以外に Bazaar と CVS もよく使っています。 その他の大半のシステムについては、 使用経験がないに等しいものばかりです。 ここにあげた情報は、それぞれのシステムのウェブサイトを参考にしたものです。 もご覧ください。 <emphasis role="bold">Subversion</emphasis> — <ulink url="http://subversion.tigris.org/"/> Subversion が書かれた最大の目的は、CVS にとってかわるシステムを作ることです。 CVS とほぼ同じような方法でバージョン管理を行いますが、 CVS ユーザーがしばしば悩まされていた問題点や機能不備などを解消するようにしています。 Subversion の目標のひとつは、CVS になじみのある人たちが 比較的スムーズに Subversion に移行できるようにすることです。 Subverion の機能についてここで事細かに語ることは控えます。 詳細はウェブサイトをご覧ください。 [注: 私は Subversion の開発に参加しています。 また、この一覧の中で私が常用しているシステムは Subversion だけです。] <emphasis role="bold">GIT</emphasis> — <ulink url="http://git.or.cz/"/> GIT は、Linus Torvalds が Linux カーネルのソースツリーを管理するためにはじめたプロジェクトです。 最初のうちはカーネルの開発で必要となる機能に特化したものでしたが、 今では機能も増え、Linux カーネル以外のプロジェクトでも用いられるようになっています。 ホームページでの説明によると、GIT は 「……巨大なプロジェクトを高速かつ効率的に管理するように設計されており、 主に各種オープンソースプロジェクトで使用されています。 中でも有名なのは Linux カーネルです。 Git は分散型ソースコード管理ツールの一種で、GNU Arch や Monotone (あるいは独占的ソフトウェア界での BitKeeper) と似ています。 Git のすべての作業ディレクトリは、 それ単体で完全なリビジョン追跡機能を持つリポジトリであり、 ネットワークアクセスや中央サーバがなくても機能します」。 <emphasis role="bold">Mercurial</emphasis> — <ulink url="http://www.selenic.com/mercurial/"/> Mercurial は分散型のバージョン管理システムで、 "ファイルやチェンジセットの完全なクロスインデクシング、 ネットワーク帯域や CPU に優しい同期プロトコル (HTTP および SSH)、 任意の開発ブランチ間でのマージ、単体で動作するウェブインターフェイスの同梱、 UNIX でも MacOS X でも Windows でも同じように動作する" といった機能を持っています (この機能一覧は、Mercurial のウェブサイトの内容をまとめたものです)。 <emphasis role="bold">Bazaar</emphasis> — <ulink url="http://bazaar-vcs.org/"/> Bazaar (bzr) は 使いやすさと柔軟なデータモデルを追及した分散型のバージョン管理システムです。 これは GNU の公式プロジェクトであり、フリーソフトウェアプロジェクトをホスティングしている Launchpad.net で採用されています。Bazaar は完全に分散したバージョン管理を実現します。つまり、 すべての仕事をブランチでこなします。開発者は通常ブランチの変更履歴のコピーを持ちます。 それぞれのブランチは、分散型のやり方で互いをマージできますが、Bazaar は中央管理型のやり方も使えるように設定できます。 Bazaar は GNU Arch の派生プロジェクトとして出発しましたが、 のちに1から書き直され、GNU Arch とは直接の関連がなくなっています。 <emphasis role="bold">SVK</emphasis> — <ulink url="http://svk.elixus.org/"/> Subversion 上で構築されているシステムではあるものの、SVK はおそらく Subversion よりも以下にあげる分散管理型のシステムに似ています。 SVK は、分散型の開発やローカルでのコミットをサポートしています。 また変更点のマージ機能も洗練されており、 SVK 以外のバージョン管理システムのツリーを複製する機能もあります。 詳細はウェブサイトをご覧ください。 <emphasis role="bold">Veracity</emphasis> — <ulink url="http://veracity-scm.com/"/> Veracity は分散型のバージョン管理システムです。 Git や Mercurial、Bazaar などと同様にすべての開発者が完全なローカルリポジトリを持ち、 必要に応じてリポジトリ間で変更のプッシュやプルを行います。 コマンドについてはこれらのシステムとほぼ同じですが、Veracity はファイルのバージョン管理以外に 分散型のバグ追跡データベースも持っています。このデータベースも、ファイルとともにバージョン管理されます。 言い換えると、Veracity がやろうとしていることは、開発に必要となるすべての成果物を (ソースコードツリーだけでなく、バグレポートも含めて) バージョン管理システムの配下に置くということです。 かなり野心的な考えです。残念ながら私はまだ使う機会がないのですが、 使ったことがある人の感想をぜひ聞いてみたいと思います。Veracity は主に SourceGear, Inc が開発しています。同社は長い歴史を持ち、 バージョン管理やソフトウェア構成管理などにかかわっています。 よく似たシステムである も参照ください。 <emphasis role="bold">Fossil</emphasis> — <ulink url="http://www.fossil-scm.org/"/> Fossil が と似ている点は、 どちらも分散型バージョン管理システムであり、 さらにどちらも単にコードだけをバージョン管理するわけではないというところです。 Fossil は、バグ追跡データベースや分散型の Wiki、そして 分散型のブログなどもバージョン管理します。その他の機能としてはデフォルトの "autosync" モードがあり、このモードは、衝突しない変更はすべて自動的にマージします (つまり、Fossil は中央管理型の環境でもそうでない環境でも動かせます。 他の分散型システムも理屈の上ではそのとおりなのですが、 Fossil はさらにもう一歩進んで、実際に中央管理型のワークフローに対応しているのです)。 ウェブインターフェイスも同梱されており、コードリポジトリをブラウザで閲覧することもできます。 Fossil を主に開発しているのは Dr. Richard Hipp です。 おそらく SQLite データベースエンジンの作者としてのほうがよく知られていることでしょう。 Veracity と同様、私は Fossil も使ったことがありません。 使ったことがある人は、ぜひ感想を聞かせてください。 <emphasis role="bold">CVS</emphasis> — <ulink url="http://www.nongnu.org/cvs/"/> CVS は長い歴史を持っており、多くの開発者にとっておなじみのものです。 公開された当時は革命的な存在でした。 オープンソースのバージョン管理システムとしては初めて (少なくとも私の知る限り) 離れた場所にいる開発者達によるネットワーク経由のアクセスに対応し、 また初めて匿名での読み込み専用チェックアウトに対応しました。 これにより、新しい開発者が容易にプロジェクトに参加できるようになったのです。 CVS がバージョン管理するのはファイルのみであり、 ディレクトリのバージョンは管理しません。 ブランチやタグの機能を持っており、 クライアント側でも高速に動作しますが、 巨大なファイルやバイナリファイルはうまく扱うことができません。 また、アトミックなコミットにも対応していません。 [注: 私はかつて、約 5 年にわたって精力的に CVS の開発に携わってきました。 その後、CVS にかわるシステムとしての Subversion プロジェクトの立ち上げにかかわりました。] <emphasis role="bold">Darcs</emphasis> — <ulink url="http://darcs.net/"/> 「David's Advanced Revision Control System は、 CVS のかわりとなるソフトウェアのひとつです。Haskell で書かれており、 Linux や MacOS X、FreeBSD、OpenBSD そして Microsoft Windows で動作します。Darcs には cgi スクリプトも含まれており、 これを用いてリポジトリの中身を見ることができます。 <emphasis role="bold">Arch</emphasis> — <ulink url="http://www.gnu.org/software/gnu-arch/"/> GNU Arch は、分散型の開発と中央管理型の開発の両方に対応しています。 開発者は、変更内容を「アーカイブ」にコミットします。 アーカイブはローカルに持つこともできます。 また、変更内容を他のアーカイブとの間でやりとりし、 アーカイブの管理者がそれを適用することもできます。 その方式からも想像できるように、Arch のマージ機能は CVS のものより洗練されています。Arch はまた、 コミット権を持たない人でも簡単にアーカイブのブランチを作れるようになっています。 ここで紹介したのは概要にすぎません。詳細は Arch のウェブページをご覧ください。 <emphasis role="bold">monotone</emphasis> — <ulink url="http://www.venge.net/monotone/"/> 「monotone は、フリーな分散型バージョン管理システムです。 単一のファイルからなるシンプルかつトランザクショナルな形式でデータを格納し、 ネットワークから切断されていても完全に機能します。また、 効率的なピアツーピア同期プロトコルを持っています。 履歴を考慮したマージ、軽量なブランチ作成、コードレビュー、 サードパーティによるテストなどの機能があります。 バージョンの命名は暗号化されており、クライアント側で RSA 証明書を使用します。 国際化対応も十分にされており、別のソフトウェアに依存することもありません。 linux や solaris、OSX、windows で動作し、GNU GPL のもとで公開されています」 <emphasis role="bold">Codeville</emphasis> — <ulink url="http://codeville.org/"/> 「なぜいまだにそんなバージョン管理システムを使ってるんですか? ほかのバージョン管理システムってみんな、 ブランチをマージするときの衝突を起こさないように 細心の注意を払わなければならないじゃないですか。 Codeville ならそんな心配は無用。 いつでもどのリポジトリからでもアップデート可能で、 無駄なマージは発生しません」 「Codeville は、それぞれの変更に対して ID を作成します。 そして、各ファイルに対して行われたすべての変更の一覧と ファイル内の各行がどの変更で更新されたのかを覚えておきます。 衝突が発生した場合は、お互いが相手側の変更を適用済みかどうかを調べ、 変更済みであった場合は自動的にそちらが優先されます。 自動的にマージできない衝突があった場合は、Codeville の挙動は CVS とほぼ同じものとなります」 <emphasis role="bold">Vesta</emphasis> — <ulink url="http://www.vestasys.org/"/> 「Vesta はポータブルな SCM [ソフトウェア設定管理] システムで、小規模 (ソースコード 10,000 行未満) から大規模 (ソースコード 10,000,000 行以上) まであらゆる規模のソフトウェアシステムの開発をサポートします」 「Vesta は円熟したシステムです。Compaq/Digital Systems Research Center における 10 年以上の研究開発の結果として生まれたものであり、 2 年半以上にわたって Compaq の Alpha マイクロプロセッサグループが実際に使用しています。 Alpha グループには 150 人以上のアクティブな開発者がおり、 彼らは何千マイルも離れた 2 拠点 (アメリカの東海岸と西海岸) で働いています。彼らが Vesta を使って管理しているのは、 130 MB におよぶソースデータとビルドで、 そこから生成される派生データは 1.5 GB になります。 ビルド作業は東海岸の拠点で行われ、平均して 10-15 GB の派生データを生成しますが、これらもすべて Vesta で管理しています。 Vesta はソフトウェア開発のために設計されたものですが、 Alpha グループはこのシステムがハードウェア開発にも使えることを示しました。 ハードウェア記述言語ファイルを Vesta のソースコード管理機構にチェックインし、 Vesta のビルダーを使ってシミュレータやその他の派生オブジェクトをビルドしたのです。 かつての Alpha グループのメンバーは今は Intel にいますが、 今もなお新しいマイクロプロセッサのプロジェクトで Vesta を使い続けています」 <emphasis role="bold">Aegis</emphasis> — <ulink url="http://aegis.sourceforge.net/"/> 「Aegis は、トランザクションベースのソフトウェア構成管理システムです。 Aegis が提供するフレームワークを使用すると、 開発者チームの各メンバーがそれぞれ独自にプログラムに変更を加えることができます。 Aegis が各変更点を統合してプログラムのマスターソースに書き戻しますが、 その際に面倒な作業が極力起こらないようにします」 <emphasis role="bold">CVSNT</emphasis> — <ulink url="http://cvsnt.org/"/> 「CVSNT は、高機能なマルチプラットフォーム対応バージョン管理システムです。 業界標準の CVS プロトコルをサポートしているだけでなく、さまざまな機能があります。 CVSNT はオープンソースで、GNU Geleral Public License で公開されているフリーソフトウェアです」 機能一覧には以下のような内容が書かれています。 すべての標準 CVS プロトコルによる認証だけでなく Windows 固有の SSPI や Active Directory による認証、 sserver あるいは暗号化 SSPI による安全な転送のサポート、 クロスプラットフォーム (Windows でも Unix 環境でも動作する)、 Win32 システムと完全に統合した NT バージョン、 マージポイント処理 (タグを打たなくてもマージができる)、 活発に開発が進行中です。 <emphasis role="bold">META-CVS</emphasis> — <ulink url="http://common-lisp.net/project/meta-cvs/"/> 「Meta-CVS は CVS を基にしてつくられたバージョン管理システムです。 ネットワーク対応を含む CVS のほとんどの機能を保持しているだけでなく、 CVS よりも機能的で簡単に使用できます」 META-CVS のウェブサイトの機能一覧には、次のような機能が記載されています。 ディレクトリ構造のバージョン管理、より改善されたファイルタイプ処理、 シンプルでユーザーに優しいブランチ/マージ処理、シンボリックリンクのサポート、 バージョン管理データへのプロパティリストの付加、 より改善されたサードパーティデータの取り込み処理、 そして CVS からの移行が容易であるということです。 <emphasis role="bold">OpenCM</emphasis> — <ulink url="http://www.opencm.org/"/> 「OpenCM は、安全で高品質な CVS 代替システムとして設計されています。 主要な機能については機能一覧ページに掲載されています。CVS ほど 『機能満載』なわけではありませんが、CVS にはない便利な機能をいくつか持っています。 簡単にまとめると、OpenCM はファイルのリネームに対応しており、 また暗号化した認証処理やアクセス制御、そして高機能なブランチ処理にも対応しています」 <emphasis role="bold">PRCS</emphasis> — <ulink url="http://prcs.sourceforge.net/"/> 「PRCS は Project Revision Control System の略で、(CVS のように) ファイルやディレクトリのバージョンを管理するツール群のフロントエンドとなります。 その目的は SCCS や RCS、CVS と同じですが、(少なくとも作者によると) それらのシステムよりもずっとシンプルだということです」 <emphasis role="bold">ArX</emphasis> — <ulink url="http://www.nongnu.org/arx/"/> ArX は分散型のバージョン管理システムです。ブランチやマージ機能、 暗号化したデータの整合性の検証機能があります。また、 任意の HTTP サーバ上で容易にアーカイブを公開できる機能もあります。 <emphasis role="bold">SourceJammer</emphasis> — <ulink url="http://www.sourcejammer.org/"/> 「SourceJammer は、Java で書かれたソース管理/バージョン管理システムです。 サーバサイドのコンポーネントとクライアントサイドのコンポーネントで構成されており、 サーバサイドではファイルやバージョン履歴の管理、チェックインやチェックアウトなどの処理、 そしてその他のコマンドを扱います。 クライアントサイドでは、サーバからのリクエストを受けてファイルシステム上のファイルを管理します」 <emphasis role="bold">FastCST</emphasis> — <ulink url="http://www.zedshaw.com/projects/fastcst/index.html"/> 「ファイル単位のリビジョンではなくチェンジセットを扱い、 中央管理ではなく分散型で処理を行う『モダンな』システムです。 メールアカウントさえあれば FastCST を使うことができます。 大規模な分散開発に必要なのは、FTP サーバあるいは HTTP サーバのみです。 あるいは、組み込みの 'serve' コマンドを使って直接管理することもできます。 すべてのチェンジセットは完全に一意であり、大量のメタデータを含んでいます。 そのため、チェンジセットをわざわざ適用してみなくても、不要なものを判断することができます。 マージ処理は、別のチェンジセットにマージするのではなく、 マージされたチェンジセットを現在のディレクトリの内容と比較することで行います」 <emphasis role="bold">Superversion</emphasis> — <ulink url="http://www.superversion.org/"/> 「Superversion は、マルチユーザー対応の分散型バージョン管理システムで、 チェンジセットにもとづいた処理を行います。 商用製品に取って代わるオープンソースの選択肢として、 商用製品なみ (あるいはそれ以上) の使いやすさと同等の機能を持つことを目指しています。 実際のところ、直感的で使いやすい操作性というのは Superversion の開発が始まった当初から最も重視してきたものです」