miau's blog?

Subversion 初期設定(1)

ここ数年 SVN/Trac 周りの管理っぽいことをやってることが多くて、「これ blog に書こうかなー」と思うことが多いんですが。細かいことをいろいろ書く前に基本をひととおり書いておいたほうがなんとなくやりやすいので、がんばってまとめようかと。

ということで、いくつか tips っぽいのも交えつつ、インストール済みの SVN や Trac の初期設定についてまとめてみます。べつに決定版とかいうわけでなく「最近はこうしてるよ」って程度のものです。

なんだか無駄に長くなってしまったので何回かに分けます。ひとまず今回は
・ルートディレクトリの作成
・管理ファイルの格納
・pre-commit hook の設定
まで。これだけでも結構な長文なので要注意です。





■前提(たぶん読み飛ばして OK)

・プロジェクト名の部分はすべて hoge としておきます。
・SVN と Trac が同一の Linux サーバ(hoge_svr)に同居していて、SVN リポジトリが /home/svn/hoge、Trac が /home/trac/hoge という環境を想定してます。
・それぞれ HTTP でのアクセスでは http://hoge_svr/svn/hoge http://hoge_svr/trac/hoge としておきます。
・SVN はプロジェクト単位でリポジトリを作成しており、Trac もマルチプロジェクト構成になっている前提です。
・Trac は PostgreSQL を使用しており、SQLite のデータファイルは存在していません。
・実際操作したときの SVN バージョンは 1.3.2、Trac は 10.0.4 でしたけど、その後バージョンアップとかしてるのでなんとも言えません。
・実際の手順と微妙に違う箇所がありますので、ちゃんと動作しない箇所があったらすみません。

■ルートディレクトリの作成

必要になってから作ってもいいんですが、作っておいたほうが安心できます。

まずプロジェクトの成果物を格納するために trunk、branches、tags を作っておきます。

それ以外にも必要に応じて vendorsrc(サードパーティ製のソース)、received(受領ファイル)というディレクトリをリポジトリのルートに置きます。これらはプロジェクトの成果物とライフサイクルが違うので、trunk 配下に置くべきではありません。プロジェクトで必要なファイルは、バージョンに応じて trunk 配下にコピーしましょう。

そんな感じでリポジトリのルートはけっこうごちゃごちゃしがちなので、trunk、branches、tags は hoge/trunk、hoge/branches、hoge/tags のように一階層下げることもあります。また、まじめにライフサイクル単位で分割するよりも「src 配下のみ trunk/branches/tags で管理する」と割り切るほうが現実的な気もしています。ソースファイル+本番サーバ用設定ファイル以外で branch 作りたくなったことって今までないので。(2009-03-29 追記: 複数バージョンを管理する必要がない Web アプリケーションでの話です。1.x 系と 2.x 系を平行開発するようなケースでは doc なんかも trunk 配下にすべきでしょう。)

■管理ファイルの格納

まずやることは SVN や Trac の管理ファイルを SVN に格納することです。リポジトリは「そのプロジェクトに必要なものをすべて格納する場」であることが理想ですから、これらも管理の対象にしましょう。
SVN であれば hooks ディレクトリ、Trac であれば logs ディレクトリ以外を SVN に格納してしまいます。これ以外にも httpd.conf や php.ini があれば一緒に入れてしまってもいいかもしれません。

今回はこれらをリポジトリ直下の envs に格納することにします。

○SVN の hooks ディレクトリ

そもそもこれが何かというと、SVN に対して行う特定の操作の前後に動作させることができるスクリプトです。pre-commit であればコミット直前に実行されるスクリプト、post-commit であればコミット直後に実行されるスクリプト、といった感じです。

SVN をインストールすると、hooks ディレクトリに各フックスクリプトのテンプレートが格納されています。これをこのままの状態でインポートしてしまいます。

cd /home/svn/hoge
svn import -m 'SVN の hooks ディレクトリをインポート。' hooks file:///home/svn/hoge/envs/svn/hooks

変更を SVN で管理できるように、/home/svn/hoge/hooks を SVN の作業コピーとして扱えるようにしておきます。

cd /home/svn/hoge
mv hooks hooks_backup
svn co file:///home/svn/hoge/envs/svn/hooks hooks

残念ながら SVN では既存ディレクトリをそのまま SVN の作業コピーとして使うことができないので、別ディレクトリにチェックアウトして、それに差し替えます。hooks_tmp/.svn を hooks 配下にコピーしてもいいんですが、owner とかが食い違ってると何かと面倒なので、差し替えてしまったほうが楽です。

○Trac ディレクトリ

まずは SVN のときと同じようにインポートです。もしすでに Trac を触っているならログは削除しておいたほうがいいでしょう。

cd /home/trac/hoge
rm log/*
svn import -m 'Trac ディレクトリをインポート。' . file:///home/svn/hoge/envs/trac

で、チェックアウトです。一応バックアップをとっておいたほうがいいでしょう。chmod も必要かもしれません。

cd /home/trac
mv hoge hoge_backup
svn co file:///home/svn/hoge/envs/trac hoge


log 配下のファイルは誤ってコミットしてしまわないよう svn:ignore 属性を指定してしまいます。これを指定しておくと、勝手にコミットされることがなくなります。

svn propset 'svn:ignore' '*' log
svn ci -m 'trac/log に svn:ignore を指定。' .

trac.ini の編集についてはまたいずれ別項で。。

■pre-commit hook で空メッセージを許可しないよう設定

コミットメッセージは結構重要な情報なので、pre-commit hook で空メッセージを許容しないように強制してしまいます。

○hook の概要

hook を有効にするのは結構簡単で、hooks ディレクトリに pre-commit という名称で実行可能ファイルを配置するだけです。
(リポジトリに直接アクセスしているのが Windows であれば、hooks.bat とか hooks.cmd という名称で作成します。)

post- 系の hook であればこのスクリプトが勝手に実行されるだけなんですが、pre- 系の hook は 0 以外のリターンコードを返すことで、その操作を失敗させることができます。

pre-commit.tmpl がそのサンプルなので、これを見るのが早いと思います。

#!/bin/sh

# (コメントは省略)

REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/local/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | \
grep "[a-zA-Z0-9]" > /dev/null || exit 1

# Check that the author of this commit has the rights to perform
# the commit on the files and directories being modified.
commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1

# All checks passed, so allow the commit.
exit 0

pre-commit なので、コミット直前に実行されるスクリプトで、
・コミットログが半角英数字を含まなければコミット失敗
・適切な権限を持たないユーザはコミットできない
というような制御をやってます。

○pre-commit hook の設定(あまりよくない方法)

じゃあこれをコピーして実行権限つけて適当にカスタマイズすればいいんでしょ?ということで

cd /home/svn/hoge/hooks

# テンプレートをコピー
cp pre-commit.tmpl pre-commit

# pre-commit を SVN に追加
svn add pre-commit

# 実行可能にしておく
chmod 0755 pre-commit

# pre-commit を適当に編集して SVN にコミット
vi pre-commit
svn ci -m 'pre-commit hook で空のコミットメッセージを許可しないよう設定。' pre-commit

なんてことをやってしまいたくなりますが、SVN での管理ファイルに cp コマンドを使うのはあまりよろしくありません。(chmod コマンドはケースバイケース。)

○pre-commit hook の設定(たぶんいくらか良い方法)

実際の手順はこんな感じ。

cd /home/svn/hoge/hooks

# SVN の cp コマンドを使用してテンプレートをコピー
svn cp pre-commit.tmpl pre-commit

# SVN の属性として実行可能属性を付加
svn propset 'svn:executable' '*' pre-commit

# pre-commit を適当に編集して SVN にコミット(ここは同じ)
vi pre-commit
svn ci -m 'pre-commit hook で空のコミットメッセージを許可しないよう設定。' pre-commit

まず svn cp は SVN 上でのコピーを行うコマンドです。cp コマンド+svn add した場合は、SVN は新しいファイルがどのファイルを元に作られているか知らないので完全に新しいファイルとして扱いますが、svn cp では SVN が元ファイルの情報を知ることができるので、差分情報で管理されます。そのため
・SVN リポジトリの容量を節約できる(コピーするだけならメタデータしか増えない)
・チェンジセットを見るだけでコピー元ファイル(今回は .tmpl)からの変更点を確認できる
・コピー元のファイルが変更された場合にも適切にマージできる
といった利点があります。これは hook に限らず SVN に登録するファイルすべてに言えることです。svn add や svn import を行う際には、本当にそのコマンドが適切か考えましょう。

続いて svn propset 'svn:executable' ですが、実行ファイルであることを表す属性を付加してます。こうすることで実行権限が付加されますし、別 PC で SVN からチェックアウトした際にも実行権限をつけることができます。(Trac からダウンロードできる更新ファイルを .zip に固めることができますが、ここには反映されてませんでした。なんだか勿体ない。)
今回は hook なので他の PC で使ったりはしないと思うんですが、まあ習慣として。

○編集内容

で、pre-commit の編集ですが。
・半角英数字のチェックだと日本語のみのメッセージでエラーになってしまうので、空文字チェックに差し替え
・アクセス制御については Apache 側でやっているので処理を削除
ということで、2 箇所編集してしまいます。

grep "[a-zA-Z0-9]" > /dev/null || exit 1

の行を以下のように変更。

grep "[^[:space:]]" > /dev/null || \
{ echo "Empty messages are not allowed" 1>&2 && exit 1; }

そして以下の 3 行(前後の空白行も入れると 4 行)を削除。

# Check that the author of this commit has the rights to perform
# the commit on the files and directories being modified.
commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1


バージョン管理システムを使っている以上はコメントアウトでなく削除してしまったほうが良いです。ちゃんと履歴が残るので。

このコミットは「やっぱりアクセス制御やりたい」となったときに気軽に逆マージできるように 2〜3 回に分けたほうがいいといえばいいんですが・・・まあそこは適当にさじ加減で。なんか諸々うまく扱えるようになってくると、1% くらいの例外のためにやたら複雑なシステムや運用に走っちゃいがちですが、そこは我慢。


ということで、SVN の残りの hook の設定についてはいずれまた。(分量が結構増えそうなので、間があいちゃうとは思います。)
posted at 02:43:10 on 2009-03-15 by miau - Category: Trac 1 Trackback - Permalink

TrackBack

miauの避難所
Subversion 初期設定(2): 半年ほど前に、当時のメインブログで Subversion 初期設定(1) - miau’s blog? というのを書いていたんですが、その続きを書いてみます。今回は post-commit hook の設定 の部分。書いてから気づいたんですが、特に変わったことやってないです・・・。
2009/08/06 20:08
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。