Subversionの設定



●Subversionとは

 Subversionとは、無償で利用できるバージョン管理システムです。現在もオープンソースで活発に開発が進んでおり、執筆時点の最新バージョンは1.4.2となります。バージョン管理システムとは、ソースコードや仕様書などを含むドキュメントなど、時間とともに内容が変化するファイルを管理するシステムの総称です。
 詳細については、Subversionによるバージョン管理を参照してください。
 Subversionと同じようなバージョン管理システムとしては、CVS(Concurrent Version System)が有名ですが、SubversionではこのCVSで使いにくかった点を改良した次世代バージョン管理システムというコンセプトで開発が続けらています。導入をおすすめするバージョン管理システムは、やはり「Subversion」です。
 SubversionではプログラムのソースコードやWebサイトイメージを含むコンテンツ、WordやExcelで書かれた仕様書など、どのようなファイルでも1つの場所にまとめて管理することができます。
 この管理する場所のことをリポジトリと呼びます。リポジトリには、プロジェクトと呼ばれる単位で複数のプログラムを1つのリポジトリ上にまとめて管理することが可能です。
 またSubersionは、WindowsやLinux、Mac OS Xなど、ほとんどのオペレーティングシステム上に導入して利用することができます。
 Subversionを導入する際には、サーバマシンにSubversionを導入するコストやその使い方を学ぶためのコストがかかることは想像できると思います。しかしSubversionを導入すると、その投資以上に様々な利点があるのです。

・すべてのファイルを一元管理

 先ほど述べましたが、Subversionではリポジトリにまとめてファイルを管理しています。つまり1つのコンピュータの中にすべてのファイルを管理することができるのです。そのため複数のコンピュータで管理する場合と比べて、管理コストを最小限に抑えることができます。
 1つのリポジトリには、複数のプロジェクトと呼ばれる単位で追加することができるため、例えば「プロダクトA」「プロダクトB」といったプロダクト単位で管理することができます。またリポジトリだけをバックアップしておけば、万が一ファイルが消えてしまった場合に備えておけるため安心です。

・チームでの共同作業を省力化

 Subversionでは、リポジトリにネットワークを通してアクセスします。リポジトリにアクセスすると自動的にSubversionが自分の環境にリポジトリのコピーを作ります。開発者はリポジトリを直接変更するのではなく、リポジトリのコピーを変更するため、複数の人がそれぞれ同時に同じファイルを変更することができます。ファイルを変更し終えた後は、ファイルの変更内容をリポジトリに登録するだけです。

・ファイルの変更内容を管理

 Subversionでは、ファイルの内容とあわせてファイルの変更内容(差分)も管理しています。この差分は、リポジトリにファイルの変更内容を登録するたびに作成されますので、例えばある時点でプログラムの動作に不備があった場合には、差分だけを参照することで原因の追及がしやすくなります。
 この利点だけを考えても、チームで開発しているプロダクトだけではなく、1人で開発しているプロダクトもSubversionによって管理する意味は大きいでしょう。

 これらの利点に加えて加えてSubversionの導入は、とても簡単に行えますので、導入コスト以上の効果を期待できるでしょう。

用語 用語(英語) 概要
リポジトリ Repository Subversionにおいて、すべてのファイルと履歴情報を格納しているところです。ファイルなどすべての管理は、リポジトリを中心に行われます。
リビジョン Revision ファイルを管理するためにSubversionが付加する番号。この番号を利用することで、ファイルの変更履歴やどこを変更したかのチェックをすることができます。
プロジェクト Project マイドキュメントやWebサイトなど管理するファイルをまとめたもののこと。SubversionではProjectごとにフォルダを設定することで一つのリポジトリでプロジェクトを管理できますが、この場合まとめてリビジョン番号が変わってしまいます。管理を簡単にするならリポジトリは一つで十分ですが、仕事ごとにリビジョン番号を付けたい場合は複数のリポジトリを使い分けるほうが良いみたいです。
URL URL Subversionでプロジェクトを指定する書式。この書き方を使うことで、サーバ上のローカルやネットワーク上のPCからの書式の違いがなくなります。
インポート import プロジェクトを管理するためにプロジェクト中のファイル群をSubversionに登録すること。Subversionを使うには、まずこれを行う必要があります。
チェックアウト checkout Subversionからファイル群を取ってくること。Subversionが管理するためのデータも含まれるので、Subversionでプロジェクトを管理するにはチェックアウトしたプロジェクト中でファイルを編集する必要があります。
ワーキングコピー working copy チェックアウトによってSubversionから取り出してきたファイル群。複数のユーザがおのおの持つことができます。
アップデート update 手元のワーキングコピーを更新して最新の状態にすること。複数ユーザでプロジェクトを運営している場合は、自分が知らないうちに変更されていることがあるのでアップデートを行ってから変更する必要があります。
コミット commit 自分の手元でのファイルの変更・追加などを確定し、Subversionに格納すること。コミットをしないといくら修正しても意味はありません。また、意味のない修正でバージョンをむやみに増やすのも考え物。サジ加減は慣れが必要ですね。
トランク、ブランチ、タグ trunk、branch、tugs Subversionで最初に登録する時に作成するフォルダ。トランクは現在作成中のもの、ブランチはソフトのバージョンアップ作業中で前のバージョンの保守などのために利用するもの、タグはバージョン1.0をリリースした時のソースすべてなど特定のリビジョンを保存するために利用するもの。プロジェクト一つ事に必ず用意しておくと覚えておくと良いでしょう。
マージ merge ブランチ上の変更を現在変更中であるトランクのソースに適用すること。ソフトウェア開発ではデバッグしたソースの適用などに使います。


●Subversionのインストール

 SubversionはApache無しでも動作させることができますが、Apacheと連携して動作させることで、ApacheのBasic認証やDigest認証等の認証機能、SSL等の暗号化通信等を利用することができます。
 また、ブラウザから、最新のリポジトリの内容を見ることができます。既にApacheを運用しているサーバでSubversionを利用する場合は、Apapcheとの連携はそんなに手間ではありませんので、お勧めです。Apacheが利用するポートで通信を行うため、新たにポートを空ける必要もありません。
 ただし、Apacheの各種設定にはApacheの再起動を伴うケースがある事にも留意してください。

 Subversionのインストールを行います。Subversionはそれ単体でも動きます。このページではApacheと連携してSubversionを動作させる方法をご紹介します。Gentoo LinuxでSubversionをインストールする際は、インストール時にUSE="apache2"を指定することで、Apacheと連携して動作させることができます。/etc/make.conf を編集するか、下記のように指定して実行してください。
# USE="apache2" emerge subversion 
・yumによるインストール
# yum install apr
# yum install apr-util
# yum install neon
# yum install neon-devel
# yum mod_dav_svn
・ソースからのインストール
$ cd /usr/local/src
$ tar zxvf subversion-1.6.2.tar.gz
$ cd subversion-1.6.2
$ ./configure
$ make
$ su
# make install
 「neon」がインストールされていない場合は、neonのインストールを参照して、subuversionより先にインストールしてください。
 subversionを先にインストールしてしまった場合は、configureから再度実施しインストールしてください。

●Subversionの設定

 Subversionがデータを管理するリポジトリと呼ばれる格納庫を作成します。例では/var/svn/reposにリポジトリを作成しています。
 リポジトリはrootでなくても作成できますが、svnコマンドを利用する際、権限の問題により不都合な事が起きます。「svnuser」ユーザでの作成を参照してください。

・root権限を使用してリポジトリを作成する場合
# mkdir /var/svn
# svnadmin create /var/svn/repos
# chmod -R o+w /var/svn/repos/db
 ↑ 他ユーザからcommitコマンド等を受け付けるようにさせる
Apacheがリポジトリに対して読み書きのアクセスができるように、所有権を変更
# chown -R apache:apache /var/svn/repos ← 所有権変更
# ls -l /var/svn/repos/* ← 所有権確認

・「svnuser」というユーザ用のホームディレクトリを作成後、リポジトリ作成する場合
$ chmod 701 /home/svnuser
$ mkdir /home/svnuser/svn
$ svnadmin create /home/svnuser/svn/repos
$ chmod -R o+w /home/svnuser/svn/repos/db
 ↑ 他ユーザからcommitコマンド等を受け付けるようにさせる
Apacheがリポジトリに対して読み書きのアクセスができるように、所有権を変更
$ su
# chown -R apache:apache /home/svnuser/svn/repos ← 所有権変更
# exit ← rootからログアウト
$ ls -l /home/svnuser/svn/repos/* ← 所有権確認
名称 説明
conf リポジトリ設定ファイルのあるディレクトリです。
dav Apacheと、内部データ管理用mod_dav_svnのためのディレクトリです。
db すべてのバージョン化されたデータが可能されています。このディレクトリはBerkeley DB環境(DBテーブルとその他必要な全体)か、リビジョンファイルを含む FSFS環境になります。
format 一つの整数値が書いてあるファイルで、この整数はリポジトリレイアウトのバージョン番号になります。
hooks フックスクリプトテンプレート全体が格納されたディレクトリです(また、インストールされたフックスクリプト自身も)。
locks Subversionリポジトリのロックされたデータのためのディレクトリでリポジトリにアクセスしている人を記録するのに使われます。
README.txt Subversionリポジトリを見る人のための情報が書かれているだけのファイルです。


  • 注意
  •  ネットワーク上で共有されたBerkeley DBリポジトリを作らないでください。NFS、AFSあるいはWindowsのSMBのようなリモートファイルシステム上にリポジトリを置くことはできません。Berkeley DBは利用するファイルシステムがPOSIXのロックの方式に厳密に従っていること、そしてさらに重要なことは、ファイルをプロセスメモリに直接マップできること、を要求します。ネットワークファイルシステムでこの性質を持っているものはほとんどありません。ネットワーク上で共有された場所の上でBerkeley DBを利用した結果については予測できません。すぐに正体不明のエラーが起きるかも知れませんし、自分のデータベースがわずかに壊れてしまったことに気づくのに何ヶ月もかかるかも知れません。
     もしリポジトリに対して複数のコンピュータがアクセスする必要があるなら、ネットワーク共有上にBerkeley DBリポジトリではなく、FSFSリポジトリを作ってください。あるいはもっと良い方法として、実際の(Apacheかsvnserveのような)サーバプロセスを設定し、サーバがアクセスできるようなローカルファイルシステム上にリポジトリを格納し、リポジトリがネットワークからも利用できるようにしてください。

 リポジトリの種類

 Subversionではリポジトリの種類として、「FSFS(Native filesystem)」 または「BDB(Berkeley database)」の2種類から選択できます。 オプションの指定が無い場合は、「FSFS」が設定されます。
 ここでは細かい説明は省略しますが、特に理由がない場合は「FSFS」を選択すれば良いと思います。どちらを選択してもデータの内部的な扱いが違うだけで、リポジトリの操作方法に変わりはありません。
 FSFS でリポジトリを作成する場合は、オプションとして「--fs-type fsfs」を指定します。BDBでリポジトリを作成する場合は、「--fs-type bdb」を指定します。

 リポジトリへのアクセス方法

Schema アクセス方法
file:/// リポジトリへの直接アクセス(ローカルディスク上)
http:// Subversionを考慮したApacheサーバへのWebDAVプロトコル経由でのアクセス
https:// http://と同じだが、SSLによる暗号化
svn:// svnserveサーバに対する独自TCP/IPプロトコル経由でのアクセス
svn+ssh:// svn://と同じですが、SSH トンネルを利用します。


●Subversionの使い方

 それではSubversionの使い方を解説していきます。今回は「test_svn」というプロジェクトをリポジトリ上に作成して、実際に「test_svn」プロジェクトを変更する方法について紹介します。

プロジェクトの作成準備

 今回は以下の3つディレクトリを含む「test_svn」プロジェクトのディレクトリを作成します。
$ ls test_svn/
branches/
tags/
trunk/
##リポジトリ内でプロジェクトが1つの場合##
$ mkdir -p test_svn/{branches,tags,trunk}
##リポジトリ内でプロジェクトが複数の場合##
$ mkdir tmpdir
$ cd tmpdir
$ mkdir -p projectA/{branches,tags,trunk}
$ mkdir -p projectB/{branches,tags,trunk}
 「branches、tags、trunk」3つのディレクトリは必須ではありませんが、開発の途中でプロジェクトが分岐したりする場合に不可欠なディレクトリとなりますので、作成しておくとよいでしょう。

リポジトリへプロジェクトの登録(import)

 リポジトリへプロジェクトを登録することをインポートといいます。さきほど作成した「test_svn」プロジェクトをリポジトリにインポートするには、次のコマンドを実行します。
##リポジトリ内でプロジェクトが1つの場合##
$ cd test_svn
root権限でレポジトリを作成した場合
test_svn$ svn import . file:///var/svn/repos -m "初めてのインポート"
svnuserユーザ権限でレポジトリを作成した場合
test_svn$ svn import . file:///home/svnuser/svn/repos -m "初めてのインポート"
Adding	test_svn/trunk
Adding	test_svn/braches
Adding	test_svn/tags
##リポジトリ内でプロジェクトが複数の場合##
$ cd tmpdir
root権限でレポジトリを作成した場合
tmpdir$ svn import . file:///var/svn/repos -m "初めてのインポート"
svnuserユーザ権限でレポジトリを作成した場合
tmpdir$ svn import . file:///home/svnuser/svn/repos -m "初めてのインポート"
Adding         projectA
Adding         projectA/trunk
Adding         projectA/branches
Adding         projectA/tags
Adding         projectB
Adding         projectB/trunk
Adding         projectB/branches
Adding         projectB/tags
 正しくリポジトリにインポートできていれば、下記のようなメッセージが表示されます。
Commited revision 1.
 インポートが完了したら、先ほど作成したtest_svn(または、tmpdir)ディレクトリは削除して構いません。
# rm -rf test_svn(または、tmpdir)

登録したプロジェクトの取得(checkout)

 リポジトリへ登録したプロジェクトを取得することをチェックアウトといいます。
 Subversionでのリポジトリチェックアウトは「svn checkout」コマンドを使用して行います。チェックアウトを行うと、チェックアウト時に指定したフォルダ内にリポジトリに格納されたファイルと管理情報ファイルが生成されます。管理情報ファイルは.svnフォルダにまとめられています。管理情報を削除するとリビジョン管理ができなくなってしまうので消さないよう注意が必要です。
 Subversionのcheckoutコマンドは以下の書式になります。
svn checkout (リポジトリのURL) (チェックアウト先のパス)
 リポジトリのURLには、URLやファイルシステムのパスを指定することができます。URLを指定する場合は「http://profaim-linux/svn/profaim.base」のように指定し、ファイルシステムのパスを指定する場合は「file:///var/svn/profaim.base」のようにに指定します。
 さきほど登録したプロジェクトをカレントディレクトリの「svn_work」にチェックアウトにするには、次のコマンドを実行します。
$ svn checkout file:///var/svn/repos svn_work
A	svn_work/trunk
A	svn_work/branches
A	svn_work/tags
Checked revision 1.
 これで、カレントディレクトリに「svn_work」というディレクトリにリポジトリのコピーが作成されました。現時点で、リポジトリからの最新リビジョンのファイルとなります。

 レポジトリを「svnuser」のホームディレクトリ以下(例:/home/svnuser/svn/repos)に作成した場合、SSH経由、HTTP経由及びHTTPS経由でのチェックアウトの方法は下記のようになります。
 ssh1、ssh2(rsa、dsa)のどの鍵も利用できます。ペーストする際は、必ず1つの鍵が1行におさまるようにしてください。そうしないと、鍵が正確にコピーされません。
SSHの場合
svn checkout svn+ssh://access_user@(サーバ名)/home/svnuser/svn/repos svn_work
 設定しているSSH鍵のパスワードが尋ねられます。
HTTPの場合
svn checkout http://(サーバ名)/svnuser/svn/repos svn_work
 この方法を利用する場合は、●Apacheの設定を参照して設定してください。
HTTPSの場合
svn checkout https://access_user@(サーバ名)/home/svnuser/svn/repos svn_work
 svnコマンドを実行して下記のようなエラーが表示された場合
svn: 'repos' is already a working copy for a different URL
 上記の場合は、現存するワーキングコピーをチェックアウトする際用いた手法(file:///、svn+ssh://等)により再取得してください、あるいは、ワーキングコピーを削除し、新たにチェックアウトしてください。

 svnuserユーザのホームディレクトリ内に作成したリポジトリから他のユーザがチェックアウトを実行した場合に、下記のようなエラーが表示された場合
[svnuser以外のユーザ]$ svn co file:///home/svnuser/svn/repos svnuser
svn: Unable to open an ra_local session to URL
svn: Unable to open repository 'file:///home/svnuser/svn/repos'
svn: Can't open file '/home/svnuser/svn/repos/format': 許可がありません
 上記の場合は、下記のようにしてください。
[svnuser]$ chmod 701 /home/svnuser
 下記のようなエラーが表示された場合は、
svn: Unrecognized URL scheme for 'http://・・・・'
 libsvn_ra_neon-1.soが見つけられてないことが原因です。そこで、下記のコマンドを実行します。
# svn --version
svn, version 1.6.2 (r37639)
   compiled Jun  8 2009, 10:42:44
Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).
The following repository access (RA) modules are available:
以下のプロジェクトが利用できます
* ra_svn : Module for accessing a repository using the svn network protocol.
  - with Cyrus SASL authentication
  - handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
  - handles 'file' scheme
 上記のとおり、「ra_neon」の記載がありません。

 neonをダウンロードし、インストールします。
$ cd /usr/local/src
$ tar zxvf neon-0.28.4.tar.gz
$ cd neon-0.28.4
$ ./configure
($ ./configure --with-ssl ← svnでHTTPSを利用する場合)
$ make
$ su
# make install
 再度、Subversionをコンパイル、インストールします。
$ cd /usr/local/src/subversion-1.6.2
$ tar zxvf subversion-1.6.2.tar.gz
$ ./configure
$ make
$ su
# make install
 「ra_neon」のモジュールを認識してるか確認します。
# svn --version
svn, version 1.6.2 (r37639)
   compiled Jun 12 2009, 14:13:15
Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).
The following repository access (RA) modules are available:
* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.
  - handles 'http' scheme
* ra_svn : Module for accessing a repository using the svn network protocol.
  - with Cyrus SASL authentication
  - handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
  - handles 'file' scheme
 今度はきちんと認識しています。

・チェックアウトのオプション
 svn checkoutには様々なオプションを指定することができます。
 トップフォルダのみ(URLで指定した階層のみ)をチェックアウトしたい場合は、「-N」 または「--non-recursive」を指定します。
 チェックアウト対象が外部リポジトリへの参照を持っていた場合、その外部参照を無視してチェックアウトするには、「--ignore-externals」を指定します。
 リビジョンを指定してチェックアウトを行うには「-r」または「--revision」に続けてリビジョン番号を指定します。

オプション 概要
-r [--revision] <引数> <引数>=数値 : 指定したリビジョン番号
<引数>=日付 : 指定日付が始まった時点での最新リビジョン
<引数>="HEAD" : 最新リビジョン
<引数>="BASE" : 作業コピーのベースリビジョン
<引数>="COMMITTED" : BASE またはそれ以前の最後のコミット
<引数>="PREV" : COMMITTED の直前のリビジョン
-q [--quiet] 最小限の情報のみを表示
-N [--non-recursive] 単一のディレクトリのみ
--username <引数> リポジトリ認証用のユーザID
--password <引数> リポジトリ認証ユーザのパスワード
--no-auth-cache 認証情報をキャッシュしない
--non-interactive 対話式の認証用プロンプトを表示しない
--config-dir <引数> ユーザ設定ファイルのパス
--ignore-externals 外部定義リポジトリを無視


リポジトリにリソースを新規追加(add、update、commit)

 ここでは、 Subversionのクライアントツール(svnコマンド)を使用して フォルダやファイルといったリソースをSVNリポジトリ にコミットし、これらリソースをSubversionの管理下に置く方法を紹介します。大きな流れとしてはSubversionに新規フォルダ/ファイルの追加を明示する手順(add)と、Subversionに追加するとしたフォルダ/ファイルを格納する手順(commit)の2つになります。
 例えば、READMEというファイルを追加する場合を紹介します。今回はsvn_workにREADMEファイルを作成した後に、次のコマンドを実行してください。
$ cd svn_work
svn_work$ vi README
svn_work$ svn add README
A         README
 これでリソースの追加が完了しました。出力の左端の「A」が追加(Add)を表しています。
 また、Addコマンドのデフォルトでは、指定したフォルダ配下のリソースも再帰的に追加対象となりますので、配下のファイルは何も指定せずに追加対象となります。
 もし、指定したディレクトリのみを追加したい場合は「--non-recursive」オプションを指定し、実行する必要があります。
 この時点では、「新しいファイルをSVNで管理します」 とマークしただけで、まだSVNの管理下に置かれたわけではありませんので注意しましょう。このコマンドだけでは、リポジトリにはファイルが追加されていない状態であり、リポジトリにファイルが追加されたことを伝える必要があります。リポジトリにファイルの変更内容を登録することをコミットといいます。
 すぐにコミットすればファイルを追加することができますが、他の人がすでにコミットしているかもしれませんので、コミットする前に必ずリポジトリのコピーを最新に更新します。リポジトリのコピーを更新する場合は、次のコマンドを実行します。
svn_work$ svn update
At revision 1.
 リポジトリのコピーを最新に更新した後、先ほどのREADMEをコミットしましょう。コミットする場合は、次のコマンドを実行します。コミットの際にはコミットログが必須になります。これは、変更内容をコメントで残しておくことで今回のコミットが何の目的で行われたのかを明確にするためです。コミットの際には、誰が何の目的でコミットしたかがセットで記録されることになります。作業中のユーザ名と別のユーザ名でSubversionへのコミットを行いたい場合は、「--username」オプションを指定して明示する必要があります。
 ユーザ認証が設定されていた場合、パスワードを尋ねられるので入力します。
svn_work$ svn commit (--username testuser) README -m "READMEファイルを追加"
Adding	README
Transmitting file data .
Commited revision 2.
 今後、READMEファイルを変更する場合には、必ずupdateとcommitをセットで行ってください。
 これで、先ほど追加とマークしていたリソースが送信され、Subversionへ登録されました。Commited revision 1.と表示されれば、1番目のコミットとなります。今後、コミットの度に2、3、…と増えていきます。
 以上で 新規のリソースをSubversionのリポジトリで管理することができました。

 コミット時に下記のようなエラーが表示される場合があります。
svn: Can't open file '/home/svnuser/svn/repos/db/txn-current-lock': 許可がありません
 この場合は、以下のようにリポジトリとするディレクトリ以下の権限を変更します。
$ chmod -R o+w /home/svnuser/svn/repos/db

リソースの削除(delete)

 必要のなくなったリソースの削除方法を示します。今回削除するのは、上記で作成した「test_svn」です。
削除したいリソースのコピーが無い場合、チェックアウトする
$ svn checkout file:///var/svn/repos svn_work
$ cd svn_work
$ svn list file:///var/svn/repos ← 一覧の表示
trunk/
branches/
tags/
上記すべてを削除することとする
$ svn delete trunk branches tags
D	trunk
D	branches
D	tags
$ svn commit -m "(コメントを記載)"
Deleting	trunk
Deleting	branches
Deleting	tags
$ cd ..
$ rm -rf svn_work

●Apacheの設定

 SubversionとApacheを連携させるため、下記の設定を行います。

httpd.conf修正

 Subversionを使用するには、最低以下2つを書きます(または、コメントアウトします)。
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
 /etc/httpd/conf.d/subversion.confを編集します。
 上記で作成したリポジトリ対して設定を行います。以下に設定に用いる主なディレクティブをまとめました。

オプション 説明
DAV svn Subversionを利用するために必ず指定しないといけません。
SVNPath リポジトリを作成したディレクトリへのパスを指定します。ApacheのDocumentRootからではなく、システム上のパスを指定します。
SVNParentPath 主にリポジトリを複数運用する場合に用います。リポジトリの親ディレクトリを指定します。
AuthzSVNAccessFile authz_svn_moduleを利用するときに指定します。リポジトリへのアクセス権を指定したファイルへのパスを指定します。ApacheのDocumentRootからではなく、 システム上のパスを指定します。


最も単純な設定

 認証をかけない単純な設定を以下に示します。
# vi /etc/httpd/conf.d/subversion.conf
root権限でレポジトリを作成した場合
<Location /svn/repos>
  DAV svn
  SVNPath /var/svn/repos
</Location>
svnuser権限でレポジトリを作成した場合
<Location /svnuser/svn/repos>
  DAV svn
  SVNPath /home/svnuser/svn/repos
</Location>
 SVNPathディレクティブで、リポジトリを作成したディレクトリのパスを指定します。
 Apacheを再起動します。
# service httpd restart

リポジトリが複数の場合

 リポジトリを複数管理したいケースもあると思います。SvnPathを用いた場合、リポジトリを追加するたびに設定も追加し、Apacheを再起動する必要があります。しかし、SVNParentPathを用いれば、親となるディレクトリを指定するだけでよいため、設定が煩雑にならなくて済みます。
 また、リポジトリの追加時には、Apacheを再起動する必要がありません。リポジトリにアクセスする場合は、リポジトリ名(例ではrepos)まで指定します。
<Location /svn/repos>
  DAV svn
  SVNParentPath /var/svn
</Location>
  上記の書き方ではエラーとなってしまう
<Location /svn>
  DAV svn
  「SVNListParentPath」はSubversion1.3以降で、
  SVNParentPathディレクトリで指定したパス以下のリスティングを可能とする
  SVNListParentPath on
  SVNParentPath /var/svn
</Location>

Basic認証を用いたアクセス制御

 Basic認証の設定方法については、「Webサーバの設定方法」の●WebDAVの設定を参照ください。
 誰でも読み書きを許す設定は、当たり前ですが好ましくありません。以下はBasic認証を付加した設定です。これで読み取り、書き込みは認証を通過したユーザしか行えません。設定後、Apacheの再起動が必要です。
root権限でレポジトリを作成した場合
<Location /svn/repos>
  DAV svn
  SVNPath /var/svn/repos
   
  #Basic認証の設定
  Require valid-user
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /var/.svn_conf/.htpasswd
</Location>
svnuser権限でレポジトリを作成した場合
<Location /svnuser/svn/repos>
  DAV svn
  SVNPath /home/svnuser/svn/repos
   
  #Basic認証の設定
  Require valid-user
  AuthType Basic
  AuthName "Subversion SVNUSER's repository"
  AuthUserFile /home/svnuser/.svn_conf/.htpasswd
</Location>
 書き込みを伴うアクセスには認証をかけ、読み込みだけのアクセスは誰でも行えるように制限をかけることもできます。この場合、<LimitExcept>ディレクティブを用いて、読み込み以外のメソッドが使用された場合は認証を必要とするよう設定します。
root権限でレポジトリを作成した場合
<Location /svn/repos>
  DAV svn
  SVNPath /var/svn/repos
  #Basic認証の設定
  #この場合、http://localhost/svn/reposにブラウザを使用して
  #または、コミットするためにアクセスした場合に認証要求されます。
  #認証後、パスワードを保存しなかった場合、再アクセス時に認証要求されます。
  Require valid-user
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /var/.svn_conf/.htpasswd
            
  #リポジトリへの書き込みを伴うアクセスには認証を必要とする
  #この場合は、上記「Basic認証の設定」の「Require valid-user」をコメントアウトします
  <LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
  </LimitExcept>
</Location>
svnuser権限でレポジトリを作成した場合
<Location /svnuser/svn/repos>
  DAV svn
  SVNPath /home/svnuser/svn/repos
  #Basic認証の設定
  #この場合、http://localhost/svnuser/reposにブラウザを使用して
  #または、コミットするためにアクセスした場合に認証要求されます。
  #認証後、パスワードを保存しなかった場合、再アクセス時に認証要求されます。
  Require valid-user
  AuthType Basic
  AuthName "Subversion SVNUSER's repository"
  AuthUserFile /home/svnuser/.svn_conf/.htpasswd
            
  #リポジトリへの書き込みを伴うアクセスには認証を必要とする
  #この場合は、上記「Basic認証の設定」の「Require valid-user」をコメントアウトします
  <LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
  </LimitExcept>
</Location>
 Subversionのバージョン1.2から「ロック機能」が導入されました。この機能はリポジトリに認証機能が設定されていないと、動作しません。本ページのようにBasic認証の設定を行えば、ロック機能を利用する事ができます。

AuthzSVNAccessFileを用いたアクセス制御

 AuthzSVNAccessFileディレクティブを用いると、リポジトリ内のディレクトリに対して各ユーザのアクセス権を細かく設定することが容易です。SVNPathとAuthzSVNAccessFileを使用すれば、リポジトリの追加とアクセス権の設定がApacheの再起動なしに行えます。
 ただし、AuthzSVNAccessFileディレクティブは必ずBasic認証の設定と組み合わせる必要があります。AuthzSVNAccessFileディレクティブだけでは動作しません。
 まずは、Apache側の設定です。Apacheの起動時にauthz_svn_moduleが読み込まれるようにします。
root権限でレポジトリを作成した場合
<Location /svn/repos>
  DAV svn
  SVNPath /var/svn/
  #Basic認証の設定
  Require valid-user
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /var/.svn_conf/.htpasswd
  AuthzSVNAccessFile /var/.svn_conf/.svnaccess
</Location>
svnuser権限でレポジトリを作成した場合
<Location /svnuser/svn/repos>
  DAV svn
  SVNPPath /home/svnuser/svn/repos
  SVNAutoversioning on
  #Basic認証の設定
  Require valid-user
  AuthType Basic
  AuthName "Subversion SVNUSER's repository"
  AuthUserFile /home/svnuser/.svn_conf/.htpasswd
  AuthzSVNAccessFile /home/svnuser/.svn_conf/.svnaccess
</Location>
 AuthzSVNAccessFileで指定されたファイル(上記例では/var/.svn_conf/.svnaccessまたは/home/svnuser/.svn_conf/.svnaccess)にアクセス権を設定します。書式は以下のようになります。
#リポジトリ名を指定する場合
[(リポジトリ名):(パス)]
(ユーザ名) = (アクセス権)

#パス名のみで指定する場合
[(パス)]
(ユーザ名) = (アクセス権)

以下に設定例を示します。
#リポジトリ:repos 内の/ProjectAディレクトリのアクセス権を設定します。
#hogeは読み書き、
#fugaは読み込み、
#mageはアクセス不可です。
[repos:/ProjectA]
hoge = rw
fuga = r
mage =
#全てのユーザは/ProjectB/branches/doc/に読み込みのアクセスが可能です。
[repos:/ProjectB/branches/doc/]
* = r
#上記でfugaは/ProjectB/doc/bug-1に読み込みのみのアクセスしかありませんが、
#その下のact-1以下のディレクトリではこちらの設定が優先されます。
[repos:/ProjectB/branches/doc/bug-1/act-1]
fuga = rw
# /branchesディレクトリへのアクセスを禁止します。
[/branches]
* = 
# 以下は有効にならない設定です
[repos:/]
* = r
# reposディレクトリ以下のディレクトリを指定する必要があります
# reposディレクトリ以下のディレクトリをすべて表示させたい場合は以下のようにします
# 以下を設定しないと、ブラウザでhttp://localhost/svnuser/svn/repos/に
# アクセスした場合、拒否され表示されません。
[/]
* = r

●リポジトリのバックアップ

 フルバックアップは下記のように行います。
$ svnadmin dump /var/svn/repos > svn_ex.dump

●svnコマンド一覧

コマンド 用法 説明
add add PATH... 通常ファイル、ディレクトリ、シンボリックリンクを作業コピーに追加しリポジトリに対する追加予告をします。次のコミットでリポジトリにアップロードして追加されます。何かを追加し、コミット前に気が変わった場合は、svn revertで追加を取り消すことができます。
blame blame TARGET[@REV]... 指定されたファイルまたは URL の変更者とリビジョン情報をインラインで表示します。それぞれのテキスト行には先頭に変更者(ユーザ名)と、最後にその行に変更があったリビジョン番号の注釈がつきます
cat cat TARGET[@REV]... T指定したファイルまたはURLの内容を表示します。ディレクトリの内容の表示については、svn listを見てください。
checkout checkout URL[@REV]... [PATH] リポジトリから作業コピーをチェックアウトします。 PATHが省略されればコピー先としてURLのベース名が使われます。複数のURLが指定された場合には、それぞれが、PATHのサブディレクトリにチェックアウトされますがここでのサブディレクトリの名前はURLのベース名になります。
cleanup cleanup [PATH...] 作業コピーを再帰的に正常化するため、操作が未完了のロックを削除します。「作業コピーロック」エラーが発生したときには、このコマンドを実行して、ロックを解除し、作業コピーを正常に戻してください。
何かの理由でsvn updateの失敗が外部 diff プログラムの実行の問題である場合(たとえばユーザ入力やネットワークの問題など)には外部diffプログラムでのマージ処理を完結させるために --diff3-cmdを渡すことができます。また--config-dirスイッチで任意の設定ディレクトリの指定もできます。ただし、これらのスイッチが必要な場面は非常にまれです。
commit commit [PATH...] 作業コピーの変更点をリポジトリに送ります。--fileか、--messageのオプションを指定しなければsvnはエディタを起動し、ユーザにコミットメッセージを作成させます。commitは--no-unlockを指定しなければ見つかったロックトークンを送信し、コミットされたすべてのPATHS上にあるロックを(再帰的に)開放します。
copy copy SRC DST 作業コピーまたはリポジトリ中のファイルをコピーします。SRCとDSTは、作業コピー(WC)上のパスでも、URLでもかまいません。
delete delete PATH... or URL... PATHで指定されたファイルまたはディレクトリは次のコミットで削除することを予告します。ファイル(と、まだコミットしていないディレクトリ)は直ちに作業コピーから削除されます。このコマンドはバージョン化されていないか修正されているものに対しては動作しません。--forceスイッチを使えばこの動作を変更できます。
URLで指定されたファイルまたはディレクトリは直接コミットを発行する形で削除されます。複数のURLは単一のトランザクションとして不分割にコミットされます。
diff diff [-r N[:M]] [TARGET[@REV]...]

diff [-r N[:M]] --old OLD-TGT[@OLDREV] [--new NEW-TGT[@NEWREV]] [PATH...]

diff OLD-URL[@OLDREV] NEW-URL[@NEWREV]
ふたつのパスの間の違いを表示します。 svn diffには三つの使い方があります。
svn diff [-r N[:M]] [--old OLD-TGT] [--new NEW-TGT] [PATH...]はOLD-TGTとNEW-TGTの間の違いを表示します。もしPATHがあればOLD-TGTやNEW-TGTに相対的なものとして扱われ、出力される相違点はそのようなパスのみに限定されます。 OLD-TGTとNEW-TGTは作業コピーパスであるか URL[@REV]であるかです。OLD-TGTのデフォルトは現在の作業コピーで、NEW-TGTのデフォルトはOLD-TGTになります。NのデフォルトはBASEですが、もしOLD-TGTがURLであればHEADになります。Mのデフォルトは現在の作業バージョンですが、もしNEW-TGTがURLであればHEADになります。svn diff -r NはOLD-TGTのリビジョンをNに設定します。svn diff -r N:MもNEW-TGTのリビジョンをMに設定します。

svn diff -r N:M URLはsvn diff -r N:M --old=URL --new=URLの略記法です。

svn diff [-r N[:M]] URL1[@N] URL2[@M]はsvn diff [-r N[:M]] --old=URL1 --new=URL2の略記法です。

TARGETがURLならNとMのリビジョンは--revisionを経由したものであるか既に述べたように「@」記法で指定されたものになります。

TARGETが作業コピーパスであれば--revisionスイッチの意味は:

--revision N:M

サーバはTARGET@NとTARGET@Mを比較します。
--revision N

クライアントはTARGET@Nと作業コピーを比較します。
(no --revision)

クライアントはTARGETのベースリビジョンと作業コピーを比較します。

別の構文を使うとサーバはそれぞれリビジョンNとMにあるURL1とURL2を比較します。もしNかMが省略されればHEADの値が使われます。

デフォルトではsvn diffはファイルの系統を無視し、単に比較対象になっている二つのファイルの内容を比較するだけです。--notice-ancestryを使うとリビジョンを比較する際に、問題になっているパスの系統が考慮されます(つまり、同じ内容を持ってはいるが異なる系統を持つ二つのファイルに対してsvn diffを実行すると、ファイル全体が一度削除され、もう一度すべてが追加された形の結果を得ることになります)。
export export [-r REV] URL[@PEGREV] [PATH]

export [-r REV] PATH1[@PEGREV] [PATH2]
最初の構文では指定されたURLのリポジトリからディレクトリツリーをエクスポートします。このさい、REVが指定されればリビジョンREVから、そうでなければ HEADのリビジョンが利用され、結果はPATHに出力されます。PATHが省略されればURLの最後の部分がローカルディレクトリ名称として利用されます。
二番目の構文ではPATH1で指定されたローカル作業コピーをPATH2に出力します。すべての作業コピーへの変更は保存されますが、バージョン管理下にないファイルはコピーされません。
help help [SUBCOMMAND...] ヘルプの表示
import import [PATH] URL PATHのコピーを再帰的にURLにコミットします。PATHがなければ「.」が仮定されます。必要に応じて親ディレクトリがリポジトリに作られます。
info info [TARGET...] 作業コピーのパスとURLの両方についての情報を表示します。
list list [TARGET[@REV]...] それぞれのTARGETファイルとTARGETディレクトリのリポジトリ中の内容を一覧表示します。TARGETが作業コピーのパスである場合、対応するリポジトリURLが利用されます。
デフォルトのTARGET値は「.」で、現在の作業コピーディレクトリのリポジトリURLを意味します。
--verboseを使うと以下のフィールドがアイテムごとの状態を示します。
・最後のコミットのリビジョン番号
・最後のコミットをした人
・データサイズ(バイト単位の)
・最後のコミットの日時
--xmlオプションをつけるとXML形式で出力します(--incrementalを同時に指定しなければヘッダとタグでくくられたドキュメント要素も一緒に出力されます)。すべての情報が対象になります。--verboseオプションは認められません。
lock lock TARGET... TTARGETそれぞれをロックします。他のユーザによってすでにTARGETのどれかがロックされていた場合、警告を出して残りのTARGETをロックします。他のユーザ、あるいは作業コピーの設定したロックを--forceオプションで横取りすることもできます。
log log [PATH]

log URL [PATH...]
デフォルトのターゲットは現在の作業ディレクトリのパスになります。引数を指定しなければsvn logは自分の作業コピーの現在の作業ディレクトリ自身とその内部のすべてのファイルとディレクトリに関するログメッセージを表示します。一つのパス、一つ以上のリビジョン、あるいはそれらの組み合わせを指定することで結果内容を指定をできます。ローカルパスのデフォルトリビジョン範囲は、BASE:1です。
URLだけを指定すれば、そのURLに含まれるすべてのログメッセージが表示されます。URLの後にパスを付ければ RL中のそれらのパスに含まれるメッセージだけが表示されます。URLのデフォルトリビジョン範囲はHEAD:1です。
--verboseを指定するとsvn logはそれぞれのログメッセージと共に関連したすべてのパスを表示します。
--quietを指定するとsvn logはログメッセージの本体部分を表示しなくなります(これは--verboseスイッチと両立します)。
それぞれのログメッセージは、そのリビジョンに影響のあるパスが二度以上要求されても、一度だけ表示されます。ログはデフォルトではコピーされた履歴に従います。--stop-on-copyはこの振る舞いを無効にしますが、ブランチが起きた場所を特定する場合には役に立ちます。
merge merge sourceURL1[@N] sourceURL2[@M] [WCPATH]

merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]

merge -r N:M SOURCE[@REV] [WCPATH]
最初の形式と二番目の形式ではソースとなるパス(これは最初の形式ではURL、二番目の形式では作業コピーパスとなります)はリビジョンNとMで指定され、その二つが比較されます。リビジョンが省略されればHEADを指定されたものとみなします。
三番目の形式ではSOURCEはURLか、作業コピーアイテムであり、その場合、対応したURLが利用されます。この、リビジョンNとMのURLが、比較対象となります。
WCPATHが変更を受け取る作業コピーパスです。もしWCPATHが省略されると、デフォルトとして「.」が利用されます。ただし、両方のソースのベース名が同じで、さらに、その名前のファイルが「.」にある場合は別で、この場合は、差分はそのファイルに適用されます。
svn diffとは違い、マージコマンドはマージ操作の実行時にファイルの系統を考慮します。これはあるブランチでの変更点を別のブランチにマージする場合に、あるブランチでは名称を変更したが、もう一方ではそうしなかったような場合に非常に重要になります。
mkdir mkdir PATH...

mkdir URL...
PATHまたはURLを最後の部分とするようなディレクトリを作ります。作業コピーPATHで指定されたディレクトリは作業コピーへの追加として予告されます。URLによって指定されたディレクトリは作成と同時にコミットされます。複数のディレクトリURLは不分割にコミットされます。どちらの場合でも途中のディレクトリはすべて存在していなくてはなりません。
move move SRC DST のコマンドは作業コピーまたはリポジトリにあるファイルやディレクトリを移動します。
propdel propdel PROPNAME [PATH...]

propdel --revprop -r REV [URL]
これはファイル、ディレクトリ、リビジョンから属性を削除します。最初の形式は作業コピーのバージョン管理された属性を削除し、二番目の形式ではリポジトリリビジョン上のバージョン管理されていない属性を削除します。
propedit propedit PROPNAME PATH...

propedit PROPNAME --revprop -r REV [URL]
一つ以上の属性を好きなエディタで修正します。最初の形式は作業コピー中のバージョン管理された属性を編集します。二番目の形式ではリポジトリリビジョン上のバージョン管理されていない属性を編集します。
propget propget PROPNAME [TARGET[@REV]...]

propget PROPNAME --revprop -r REV [URL]
ファイル、ディレクトリ、リビジョンの属性値を表示します。最初の形式は作業コピーにある一つ以上のアイテムのバージョン管理された属性を表示します。二番目の形式ではあるリポジトリリビジョンのバージョン管理していない属性を表示します。
proplist proplist [TARGET[@REV]...]

proplist --revprop -r REV [URL]
ファイル、ディレクトリ、リビジョンのすべての属性を一覧表示します。最初の形式では作業コピー中のバージョン管理された属性を表示しますが、二番目の形式ではあるリポジトリリビジョンの属性を表示します。
propset propset PROPNAME [PROPVAL | -F VALFILE] PATH [PATH [PATH ... ]]

propset PROPNAME --revprop -r REV [PROPVAL | -F VALFILE] [URL]
ファイル、ディレクトリ、リビジョンのPROPNAMEの値をPROPVALに設定します。最初の例はバージョン管理された作業コピー中の属性値の変更で、二番目はバージョン管理されていないリポジトリ上のリビジョン属性値の作成です。
resolved resolved PATH... 作業コピーのファイルまたはディレクトリの「衝突」 状態を取り除きます。このコマンドは衝突マーカを意味的に解消するのではなく、単に衝突に関係した中間ファイルを削除して、PATHでもう一度コミットするだけです。つまりSubversionにその衝突は既に「解消された」と伝えます。
revert revert PATH... ファイル、ディレクトリに対する変更をすべて取り消して衝突の状態を解消します。svn revertは 作業コピーのアイテムの内容だけではなく、属性の変更も取り消します。さらに既にやった予告操作を取り消すのにも使えます。 (たとえば、ファイルにたいする追加または削除の予告も「取り消され」ます。
status status [PATH...] 作業コピーにあるファイルやディレクトリの状態を表示します。引数がない場合は、ローカルで修正されたアイテムだけが表示されます(リポジトリに対するアクセスは発生しません。
--show-updatesを使うと、作業リビジョンと、サーバの最新ではない情報も追加されます。
--verboseを使うと、すべてのアイテムに対する完全なリビジョン情報を表示します。
出力の最初の6列のコラムはそれぞれ一文字幅で、作業コピーアイテムごとにいろいろな情報を表示します。
コラムは、アイテムが追加、削除、それ以外の変更、のどの状態かをを示します。
switch switch URL [PATH]

switch --relocate FROM TO [PATH...]
このサブコマンドは自分の作業コピーを新しいURLに更新し、複製を作ります。そうする必要はありませんが、普通はそのURLは元になる作業コピーと共通の祖先を持ちます。これがSubversionで作業コピーを別のブランチに移動させる方法です。
unlock TARGET... TARGETそれぞれをアンロックします。TARGETのどれかが他のユーザによってロックされていたり作業コピー中に正常なロックトークンが存在しない場合は警告を出して残りのTARGETのアンロックを続けます。他のユーザまたは作業コピーに属するロックを破壊するには--forceを使ってください。
update update [PATH...] svn updateは、リポジトリの修正を作業コピーに反映します。リビジョンを指定しなければ、HEADリビジョンの最新の内容が反映されます。そうでなければ、--revisionスイッチで指定されたリビジョンに作業コピーを同期します。同期処理の一部として、svn updateは作業コピーに存在する未完了のロックを取り除きます。
更新されるアイテムごとに、どのような動作を起こしたかを示す文字で始まる行が表示されます。この文字は以下のような意味です。
A 追加
D 削除
U 更新
C 衝突
G マージ
最初のコラムの文字は実際のファイルの更新を示しますが、ファイルの属性の更新状況は二番目のコラムで示します。