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形式）