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ではファイル毎にリビジョン番号がつけられている。）
# 作業ディレクトリ内に、最後にソースリポジトリと同期をとったときのファイルのコピーを持っているため、改編中のファイルの変更部の確認などがソースリポジトリにアクセスする事無く高速に実行できるdate=2017年12月。また、ファイルの差分送信が効率よく行なわれるため、プアなネットワーク環境で利用したときに快適である。
# 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 ではリポジトリの構成を以下のようにするのがよい、と提案されている。- /trunk//... - /branches///...- /tags///...
この場合 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 checkout 
作業コピーの更新
$ svn update
作業コピーの状態の表示
$ svn status
変更点の差分を表示
$ svn diff
ファイル README への変更を破棄して元に戻す
$ svn revert README
foo を bar に移動
$ svn move foo bar
コミット
$ svn commit

**脚注**

**関連項目**
 CVS- arch- バージョン管理システム- TortoiseSVN- Subversion クライアントの比較 (英語版ウィキペディア)

**外部リンク**
 subversion.apache.org-  Subversionによるバージョン管理 - O'Reilly Mediaの本「Version Control with Subversion（svnbook）」をオンラインで読める公式ウェブサイト-  Subversionドキュメントのまとめ - 「Subversionによるバージョン管理」の日本語訳（HTML/PDF/HTML Help形式）