Apache Subversion

Apache Subversion（アパッチ・サブバージョン; SVN）はプログラムのソースコードなどを管理する集中型バージョン管理システムの一つ。元々は、CollabNetが開発していたが、2009年11月7日にApache Incubatorプロジェクトのひとつとなり、2010年2月17日よりApacheのトッププロジェクトとなった。ライセンスはApache Licenseに準じたものとなっている。

概要 
歴史的には広く使われているバージョン管理システムの一つにCVSがあった。CVSにはディレクトリの移動の管理やネットワーク対応の点、不可分な更新などの点で難があった。これらCVSの問題点を解決すべく開発されたのがSubversionである。

Subversionは集中型（クライアント・サーバ型）であるが、その後、GitやMercurialやBazaarなどの分散型のバージョン管理システムが登場するようになった。例えば、Linuxカーネルの管理にはGit、Mozilla Firefoxの管理にはMercurial、MySQLの管理にはBazaarが使われている。

特徴 
Subversionの使い方はCVSによく似ている。コマンドラインで使用する際の主要なコマンド名はCVSと一致するように作られているため、クライアントはCVSからの移行がきわめて容易である。

 ディレクトリの移動や削除をサポートしている。このため、ファイル名やソースツリーの構造がはっきりと決まらないうちからバージョン管理をすることができる。
 バージョン番号（リビジョン番号）はソースツリー全体に対して振られるため、原則としては誰かがソースツリーのどこかのファイルを更新する度に番号が増えてゆく。（CVSではファイル毎にリビジョン番号がつけられている。）
 作業ディレクトリ内に、最後にソースリポジトリと同期をとったときのファイルのコピーを持っているため、改編中のファイルの変更部の確認などがソースリポジトリにアクセスする事無く高速に実行できる。また、ファイルの差分送信が効率よく行なわれるため、プアなネットワーク環境で利用したときに快適である。
 SSHによるソースリポジトリとの通信を標準でサポートしている。インターネット経由で利用してもセキュリティを容易に保つ事ができる。
 WebDAVをバックエンドとして使うことができる。つまり、Apache HTTP ServerなどのWebDAVをサポートするHTTPサーバを経由して、WebDAVプロトコルを用いてSubversionサーバとSubversionクライアントが通信するという形態が使える。

一方で CVS における module, branch, tag といった概念が Subversion では全てサブディレクトリとして設計されているので、これらの扱いは CVS とはまったく違う考え方を要する。

 CVS では <モジュール名>/<サブディレクトリ名>/.../<ファイル名> だが、Subversion では <サブディレクトリ名>/.../<ファイル名> となる。下記の2つのコマンドはほぼ同等の処理を行う。
 cvs -d:some_repository checkout -d aSubdir aModule/aDir/aSubdir
 svn co some_repository/aModuleDir/aDir/aSubdir
 CVS では tag や branch が各ファイル毎に管理されるが、Subversion では「別ディレクトリ/ファイルへのコピー」で管理される。
 cvs tag aTagName aSubdir
 svn copy aSubdir aSubdir_aTagName
 CVS の merge はタグ名が使えるのに対し、Subversion の merge はリビジョン番号や日付などで指定する。
 Subversion の svn コマンドは同じ表記でリポジトリの直接操作とローカルマシンのワーキングコピーの操作を実現するので注意を要する。
 svn copy aSubdir anotherDir はワーキングコピーでの操作で, 次に svn commit を実行することでリポジトリに反映される。
 svn copy some_repository/.../aSubdir some_repository/.../anotherDir では直接リポジトリが変更される。

一般的なリポジトリ構成
一般に Subversion ではリポジトリの構成を以下のようにするのがよい、と提案されている。
 <project>/trunk/<subdir>/... 
 <project>/branches/<branch>/<subdir>/...
 <project>/tags/<tag>/<subdir>/...
この場合 branch/tag を作成するのは以下のように、コピーするだけでよい。
 svn copy some_repository/aProject/trunk some_repository/aProject/branches/aBranchName

クライアント 
クライアントとしては、コマンドラインツールのsvnの他、以下のものがある。

 Windows - TortoiseSVN(エクスプローラ拡張)
 macOS - SvnX, Versions なお、LeopardからSubversionは標準インストールされており、Subversionサーバも自動起動している。
 Linux - RabbitVCS
 KDE - KDESvn, KSvn
 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
 Xcode - 2011年3月にリリースされた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形式）

オープンソースソフトウェア
バージョン管理システム
クロスプラットフォームのソフトウェア
協働
Apacheソフトウェア財団