Apache Subversion

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

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

概要

歴史的には広く使われているバージョン管理システムの一つにCVSがあった。CVSはよくできているが、ディレクトリの移動の管理やネットワーク対応の点、不可分な更新などでやや難があった。これらCVSの問題点を解決すべく開発されたのがSubversionである。 古くからオープンソースソフトウェアの開発においてはCVSが多く使われていたが、近年ではSubversionを使用するオープンソースプロジェクトも多くなりつつある。

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

特徴

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

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

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

  1. CVS では <モジュール名>/<サブディレクトリ名>/.../<ファイル名> だが、Subversion では <サブディレクトリ名>/.../<ファイル名> となる。下記の2つのコマンドはほぼ同等の処理を行う。
    • cvs -d:some_repository checkout -d aSubdir aModule/aDir/aSubdir
    • svn co some_repository/aModuleDir/aDir/aSubdir
  2. CVS では tag や branch が各ファイル毎に管理されるが、Subversion では「別ディレクトリ/ファイルへのコピー」で管理される。
    • cvs tag aTagName aSubdir
    • svn copy aSubdir aSubdir_aTagName
  3. CVS の merge はタグ名が使えるのに対し、Subversion の merge はリビジョン番号や日付などで指定する。
  4. 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の他、以下の物がある。


使用例

コマンドラインから使うクライアント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

関連項目

外部リンク

テンプレート:バージョン管理システム テンプレート:Apacheテンプレート:Link GA