Apache Subversionは、もともとより優れたCVSとして設計された、フル機能のバージョン管理システムです。Subversionは、CVSの代替という当初の目標を超えて拡張されましたが、その基本的なモデル、設計、およびインターフェースは、その目標に大きく影響されたままです。今日でも、SubversionはCVSユーザーにとって非常に馴染みのあるものと感じられるはずです。
以下の機能リストは、読者の皆様がバージョン管理とは何か、およびバージョン管理システムが一般的にどのように機能するかについて基本的な理解を持っているという前提で提示されています。このリストにない機能をお探しの場合、プロジェクトのメーリングリストでお気軽にお問い合わせください。おそらく、ここにリストすることを思いつかなかっただけかもしれません。もしSubversionが本当に必要な機能を欠いている場合は、フィードバックをいただければ、Subversionの改善に役立ちます。その間、Subversionが持つ機能でニーズを満たすお手伝いができるかもしれません。
CVSは比較的基本的なバージョン管理システムです。ほとんどの場合、Subversionは、Subversionの特定の設計においてこれらの機能が適用され続ける場合に、CVSの機能セットに匹敵するか、それ以上の機能を備えています。
Subversionは、ファイルと同じように、ディレクトリを第一級オブジェクトとしてバージョン管理します。
コピーと削除はバージョン管理された操作です。名前変更もバージョン管理された操作ですが、いくつかの癖があります。
Subversionでは、任意のメタデータ(「プロパティ」)を任意のファイルまたはディレクトリに添付できます。これらのプロパティはキー/値のペアであり、添付されているオブジェクトと同じようにバージョン管理されます。Subversionは、任意キー/値のプロパティをリビジョン(つまり、コミットされた変更セット)に添付する方法も提供します。これらのプロパティは、メタデータをバージョン空間自体に添付するため、バージョン管理されませんが、いつでも変更できます。
コミット全体が成功するまで、コミットの一部も有効になりません。リビジョン番号はファイルごとではなく、コミットごとに付与され、コミットのログメッセージはそのリビジョンに添付され、そのコミットの影響を受けるすべてのファイルに冗長に保存されることはありません。
これらの操作が高価になる理由はないため、高価ではありません。
ブランチとタグは両方とも、基になる「コピー」操作によって実装されます。コピーは、小さく一定量のスペースを占有します。すべてのコピーはタグです。また、コピーでコミットを開始すると、それはブランチにもなります。(これにより、そもそもブランチポイントタグを必要としていた区別を削除することにより、CVSの「ブランチポイントタグ付け」がなくなります。)
Subversion 1.5では、マージトラッキングが導入されています。これは、開発ライン間の変更の流れを管理し、ブランチをソースにマージする際に自動化された支援を提供します。1.5リリースのマージトラッキングは、一般的なシナリオに対する基本的なサポートを提供します。今後のリリースでこの機能を拡張していきます。
Subversionは、複数のユーザーが同じファイルを編集しようとした場合に警告できるように、ファイルのロックをサポート(ただし必須ではありません)しています。ファイルを編集する前にロックが必要であるとマークできます。この場合、ロックを取得するまでSubversionはファイルを読み取り専用モードで表示します。
Unixユーザーは、シンボリックリンクをバージョン管理下に置くことができます。リンクはUnixの作業コピーで再作成されますが、win32の作業コピーでは再作成されません。
Subversionは、ファイルが実行可能である場合を認識し、そのファイルがバージョン管理下に置かれると、他の場所にチェックアウトされたときに実行可能性が保持されます。(Subversionがこれを記憶するために使用するメカニズムは、単にバージョン管理されたプロパティであるため、実行可能性は、Microsoft Windowsで誤った拡張子を持つなど、ファイルの実行可能性を認識しないクライアントからでも、必要に応じて手動で編集できます。)
Subversionは、ネットワーク通信にHTTPベースのWebDAV/DeltaVプロトコルを使用でき、リポジトリ側のネットワークサービスを提供するApache Webサーバーを使用できます。これにより、Subversionは相互運用性においてCVSよりも優位になり、管理者にとって既によく知られている方法で、特定の機能(認証、ワイヤ圧縮など)を提供できます。
Subversionは、すべてのユーザーがApache HTTPDサーバーを実行したいわけではないため、カスタムプロトコルを使用したスタンドアロンサーバーオプションを提供しています。スタンドアロンサーバーは、inetdサービスとして、またはデーモンモードで実行でき、HTTPDベースのサーバーと同じレベルの認証および承認機能を提供します。スタンドアロンサーバーは、ssh経由でトンネルすることもできます。
Subversionコマンドラインクライアントのすべての出力は、人間が読めるだけでなく、自動的に解析できるように慎重に設計されています。スクリプト化は優先度の高いものです。
Subversionは、現在のロケール設定に基づいて、翻訳されたエラー、情報、およびヘルプメッセージを表示するためにgettext()を使用します。
Subversionコマンドラインクライアント(svn)は、インタラクティブな解決プロンプトを含め、競合する変更を解決するためのさまざまな方法を提供します。このメカニズムはAPI経由でも利用できるため、他のクライアント(グラフィカルクライアントなど)は、インターフェースに適したインタラクティブな競合解決を提供できます。
Subversionは、ユーティリティを提供します。svnsyncを使用して、(プッシュまたはプルによって)読み取り専用のスレーブリポジトリをマスターリポジトリと同期します。
Subversion 1.5では、ライトスループロキシ機能が導入されています。これにより、スレーブリポジトリ(読み取り専用ミラーリングを参照)は、すべての読み取り操作を自分で処理しながら、書き込み操作をマスターに渡すことができます。この機能は、Apache HTTPD(WebDAV)サーバーオプションでのみ利用可能です。
Subversionは最初からクライアント/サーバーになるように設計されています。したがって、CVSを悩ませてきたメンテナンスの問題の一部を回避できます。コードは、他のアプリケーションから呼び出すように設計された、明確に定義されたインターフェースを備えた一連のモジュールとして構造化されています。
Subversionは、連続するリビジョンを送信および保存するためにバイナリdiffアルゴリズムを使用するため、テキストファイルの場合と同様にバイナリファイルでも同じように効率的です。
一般的に、Subversion操作に必要な時間は、変更が発生しているプロジェクトの絶対サイズではなく、その操作の結果として生じる変更のサイズに比例します。
Subversion APIには、Python、Perl、Java、Rubyなど、多くのプログラミング言語のバインディングが付属しています。(Subversion自体はCで記述されています。)
Subversion 1.5では変更リストが導入されており、ユーザーは変更されたファイルをクライアント側の名前付きグループに入れて、特定のグループを指定してコミットできます。同じディレクトリツリーで論理的に分離された変更セットを同時に操作する人にとって、変更リストは整理に役立ちます。
…たとえこのリストを最新の状態に保つことができても、すべての小さな機能をリストすることはできません。詳細については、ドキュメントを参照してください。