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 ではリポジトリの構成を以下のようにするのがよい、と提案されている。
* &lt;project&gt;/trunk/&lt;subdir&gt;/... 
* &lt;project&gt;/branches/&lt;branch&gt;/&lt;subdir&gt;/...
* &lt;project&gt;/tags/&lt;tag&gt;/&lt;subdir&gt;/...
この場合 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
* 
* 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によるバージョン管理 - O'Reilly Mediaの本「Version Control with Subversion（svnbook）」をオンラインで読める公式ウェブサイト
* Subversionドキュメントのまとめ - 「Subversionによるバージョン管理」の日本語訳（HTML/PDF/HTML Help形式）