Apache Subversion(アパッチ・サブバージョン、SVN)は、ソフトウェア開発におけるソースコードなどの変更履歴を管理するための集中型
バージョン管理システムです。元々はCollabNetによって開発されましたが、
2009年に
Apache Incubatorプロジェクトに移行し、
2010年にはApacheのトッププロジェクトとなりました。
ライセンスは
Apache Licenseに準拠しています。
概要
Subversionは、以前広く使われていたCVS(
Concurrent Versions System)の課題を解決するために開発されました。CVSには、
ディレクトリ移動の管理やネットワーク対応、不可分な更新などの点で問題がありました。Subversionはこれらの問題を克服し、より効率的で信頼性の高いバージョン管理を提供することを目指しました。
Subversionは集中型(クライアント・サーバ型)のシステムですが、その後、
Git、Mercurial、
Bazaarなどの分散型
バージョン管理システムが登場しました。これらの分散型システムは、
Linuxカーネルの管理に
Git、
Mozilla Firefoxの管理にMercurial、
MySQLの管理に
Bazaarが利用されています。
特徴
Subversionの使い方はCVSによく似ており、コマンドラインでの主要なコマンド名はCVSと一致するように設計されています。これにより、CVSからの移行が容易になっています。
Subversionの主な特徴は以下の通りです。
ディレクトリの移動と削除のサポート: ファイル名やソースツリーの構造が未確定な段階でも、バージョン管理を開始できます。
ソースツリー全体に対するリビジョン番号: ソースツリー全体に対して一意のリビジョン番号が付与され、更新の度に番号が増加します。CVSのようにファイル毎にリビジョン番号が管理されるわけではありません。
高速な差分確認: 作業ディレクトリ内に最後にリポジトリと同期したファイルのコピーがあるため、リポジトリにアクセスせずに高速に変更部を確認できます。また、差分送信が効率的なため、ネットワーク環境が悪い場合でも快適に利用できます。
SSHによる通信サポート: 標準でSSHによる通信をサポートしており、インターネット経由での利用時にもセキュリティを確保できます。
WebDAVサポート: WebDAVをバックエンドとして使用でき、Apache HTTP ServerなどのWebDAVをサポートするHTTPサーバ経由での通信が可能です。
CVSとの違い: CVSにおけるmodule, branch, tagの概念は、Subversionではサブ
ディレクトリとして扱われます。CVSとSubversionではこれらの概念に対するアプローチが異なります。
CVSでは `<モジュール名>/<サブ
ディレクトリ名>/.../<ファイル名>` のように記述しますが、Subversionでは `<サブ
ディレクトリ名>/.../<ファイル名>` のように記述します。例えば、以下のコマンドはほぼ同等の処理を行います。
cvs -d:some_repository checkout -d aSubdir aModule/aDir/aSubdir
svn co some_repository/aModuleDir/aDir/aSubdir
CVSではタグやブランチがファイル毎に管理されるのに対し、Subversionでは「別
ディレクトリ/ファイルへのコピー」として管理されます。
cvs tag aTagName aSubdir
svn copy aSubdir aSubdir_aTagName
CVSではmergeにタグ名を使用できますが、Subversionではリビジョン番号や日付で指定します。
また、Subversionの `svn` コマンドは、
リポジトリの直接操作とローカルマシンのワーキングコピーの操作を同じ表記で実現するため、注意が必要です。例えば、 `svn copy aSubdir anotherDir` はワーキングコピーでの操作で、 `svn commit` を実行することで
リポジトリに反映されます。一方、 `svn copy some_repository/.../aSubdir some_repository/.../anotherDir` は直接
リポジトリを変更します。
Subversionでは、
リポジトリの構成を以下のようにするのが一般的です。
/trunk//...
/branches///...
/tags///...
ブランチやタグを作成する場合、コピー操作のみで完了します。
svn copy some_repository/aProject/trunk some_repository/aProject/branches/aBranchName
クライアント
Subversionには、コマンドラインツールの `svn` の他に、様々なクライアントが存在します。
Windows: TortoiseSVN (エクスプローラ拡張)
macOS: SvnX, Versions(macOS Leopard以降はSubversionが標準インストールされ、Subversionサーバも自動起動します)
Linux: RabbitVCS
KDE: KDESvn, KSvn
GNOME: (GNOMEデスクトップ環境向け)
クロスプラットフォーム: RapidSVN, pysvn WorkBench, eSvn, SmartSVN, QSvn
Webアプリ: FlexySvn, Trac, ViewVC
Java: SVNKit, NetBeans, sventon
Eclipse: Subclipse, Subversive
Visual Studio: AnkhSVN, VisualSVN
IntelliJ IDEA: 標準搭載またはTMate
Dreamweaver: 標準搭載またはSubWeaver
Code::Blocks: (Code::Blocks IDE向け)
Xcode: Xcode4以降、gitとSubversionが標準でサポート
使用例
コマンドラインクライアント `svn` の使用例を以下に示します。
インポート:
$ svn import project_name svn+ssh://dev.example.com/repos/svn/trunk
チェックアウト:
$ svn checkout http://svn.collab.net/repos/svn/trunk
作業コピーの更新:
$ svn update
作業コピーの状態表示:
$ svn status
変更点の差分表示:
$ svn diff
ファイル `README` への変更を破棄して元に戻す:
$ svn revert README
`foo` を `bar` に移動:
$ svn move foo bar
コミット:
$ svn commit
関連項目
CVS
arch
バージョン管理システム
TortoiseSVN
Subversion クライアントの比較 (英語版ウィキペディア)
外部リンク
公式ウェブサイト
Subversionによるバージョン管理 - O'Reilly Mediaの本「Version Control with Subversion(svnbook)」をオンラインで読める公式ウェブサイト
Subversionドキュメントのまとめ - 「Subversionによるバージョン管理」の日本語訳(HTML/PDF/HTML Help形式)