Subversion導入ツアー

(2007.8.9 更新。)

複数のPCでひとつのファイルを更新したい。しかし、たとえばノートPCがある場合などは、すべての機械が常にネットワークに接続しているわけではない。

並行して同じファイルを更新しないなら、各機械にファイルをコピーして、定期的に同期させるのがいい。

バージョン管理システム(ソフトウェア構成管理; SCM)のSubversionを導入する。

インストール

[サーバ、クライアント両方]

Fedora Core 6には、Subversionパッケージが含まれる。rpmコマンドで確認し、インストールされていなければyumコマンドでインストールする。

# rpm -q subversion xinetd
subversion-1.4.2-2.fc6
xinetd-2.3.14-8

リポジトリの作成

[サーバのみ]

Subversionでは、バージョン管理したいファイルなどを格納するデータベースをリポジトリという。まずリポジトリを作成する。ひとつのリポジトリで複数のプロジェクトを扱える。

どこでもいいが、例えば /var/svn ディレクトリに作ってみる。リポジトリのディレクトリを掘って、svnadmin createする。

# mkdir /var/svn
# cd /var/svn
# mkdir myrepo
# svnadmin create myrepo

確認してみよう。

# ls myrepo
README.txt  conf  dav  db  format  hooks  locks

svnserve経由でアクセスするときは、svnユーザを作成し(後述)、このディレクトリ以下の所有者をchownコマンドでsvn:svnに変更すること。

既存ファイルのインポート

[クライアント側]

バージョン管理したいファイルを用意する。お薦めのレイアウトがあるので、それに沿ってレイアウトする;

   リポジトリ / プロジェクトA / trunk
                             branches
                             tags
               プロジェクトB / trunk
                             branches
                             tags

「プロジェクト」は、人間の捉えかたで、Subversionにとってはただのディレクトリにすぎない。

プロジェクトの格納方法だが、リポジトリを分けるか、ひとつのリポジトリのなかでディレクトリを分けるか最初に考えておく。

認証、コミットメールの設定などはリポジトリの単位で設定するので、これらが違う場合はリポジトリを分ける。同じでいい場合は、バックアップなどの管理の手間を考え、リポジトリのなかでディレクトリを分けたほうがいい。リポジトリを跨いで(履歴を維持して)ファイルのコピーなどはできない。

初期ファイルを用意したら、svn importでインポートする。リポジトリの場所はURLで指定する。ローカルの場合は file:/// で指定できる。

# svn import repo_initial file:///var/svn/myrepo
svn: ログメッセージを取得するのに外部エディタを使えませんでした。$SVN_EDITOR 環境変数を設定するか、--message (-m) か --file (-F) オプションを用いてみてください
svn: 環境変数 SVN_EDITOR, VISUAL, EDITOR のどれも設定されていなく、実行時の設定オプション 'editor-cmd' も見つかりません

あらら。環境変数EDITORにviなどを設定し、もう一度。

(中略)
追加しています              repo_initial/rb2html/trunk/rb2html/java2html.rb
追加しています              repo_initial/rb2html/trunk/rb2html/cpp2html.rb
追加しています              repo_initial/rb2html/trunk/rb2html/html2html.rb
追加しています              repo_initial/rb2html/trunk/rb2html/pattern_lexer.rb
追加しています              repo_initial/rb2html/trunk/rb2d.rb
追加しています              repo_initial/rb2html/trunk/rb2html.rb
追加しています              repo_initial/rb2html/trunk/README

リビジョン 1 をコミットしました。
~# 

今度はできた。

外部からアクセスできるようにする。

[サーバのみ]

ローカルPCからはリポジトリに file:/// でアクセスできるが、それだけではあまり威力を発揮しない。ネットワーク経由でアクセスできるようにする。

Subversionに含まれるsvnserveサーバを使う。

ユーザを作成する

まずサーバを動かすユーザを作成する。

# /usr/sbin/useradd -M -r -s /sbin/nologin svn

useraddのオプション:

xinetdの設定ファイルを作成

svnserveはデーモンとして動かす方法と、xinetd経由で動かす方法がある。頻繁にアクセスするわけではないので、xinetd経由にする。

Fedora Coreでは,/etc/xinetd.d/ に設定ファイルを置く。/etc/xinetd.d/svnファイルを用意する。こんな感じ。

# default: off
# description: The svnserve server is a Subversion server.
service svn
{
	disable	= no
	socket_type     = stream
	wait            = no
	user            = svn
	server          = /usr/bin/svnserve
	server_args     = -i -r /var/svn
	log_on_failure  += USERID
	only_from       = 192.168.24.0/24 127.0.0.1 
}

ここで-rオプションは、ルートとなるディレクトリを指定する。

/etc/services ファイルに次の行が含まれる。

svn		3690/tcp			# Subversion
svn		3690/udp			# Subversion

xinetd を再起動するのを忘れずに。

以上で、svn://localhost/myrepo でリポジトリにアクセスできる。

ユーザ認証

(2007.8.9 この節追加。)

checkoutは誰でもできるが、commitは特定のユーザだけに許したいことがある。まず、/var/svn/リポジトリ/conf/svnserve.confファイルを編集する。

generalセクションで、パスワードを記述するファイルを指定する。

[general]
password-db = passwd

次に、passwdファイルでユーザ名とパスワードを指定する。思い切り平文だ。

[users]
harry = harryssecret

RapidSVNクライアント

[クライアント側]

Fedora Core 6には、Subversionクライアントがいくつか用意されている。そのうち、RapidSVNを試してみる。

メニュー -> Bookmarks -> Add Existing Repository でリポジトリを追加できる。そのほかいろいろ機能がある。

サイト内関連ページ

Tracを使う
プロジェクト管理ソフトTrac
Redmineでプロジェクト管理
複数のプロジェクトを管理できるRedmineの使い方
ViewVCのインストール
Apache経由でリポジトリの内容を参照

外部リンク

Subversion によるバージョン管理
Subversion本。Subversionの最初から最後まで解説している。こういう本がfree (自由) にアクセスできることに感謝。