Subversion によるバージョン管理にあるような理由で、すべてのプロジェクトを1つのリポジトリに収めるのではなく、いくつかのリポジトリに分割したい。これをWebDAVから扱うにはSVNParentPathによって、特定ディレクトリ以下のディレクトリをすべてSubversionリポジトリとして扱うのが楽である。リポジトリを追加しても設定ファイルの変更もApacheの再起動も必要ない。
<Location /svn-dav> DAV svn SVNParentPath /path/to/repositories/parent/directory/ SVNAutoversioning on AuthType Digest AuthName "Subversion Repository" AuthDigestDomain /svn/ AuthDigestFile /path/to/.htdigest Require valid-user BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On </Location>
問題はこれらのリポジトリをどうやって一覧するか、ということである。単純に、<Location></Location>
内にOption +Indexes
したのではうまくいかなかった。そこで、Subversionによるバージョン管理を行う実体は他のパスに配置することにして(仮想パス・仮想ファイルシステムについて実態って言うのも変だけど)、そのパスにmod_rewriteで転送することにした。以下を見たほうが早い。
<Location /svn-dav> DAV svn SVNParentPath /path/to/repositories/parent/directory/ SVNAutoversioning on AuthType Digest AuthName "Subversion Repository" AuthDigestDomain /svn/ AuthDigestFile /path/to/.htdigest Require valid-user BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On </Location> Alias /svn/ /path/to/repositories/parent/directory Alias /svn /path/to/repositories/parent/directory <Location /svn> Options +Indexes </Location> RewriteEngine on RewriteRule ^/svn/(.+)$ /svn-dav/$1 [PT] RewriteLog /path/to/rewrite_log RewriteLogLevel 1
これで目的は達成された。リポジトリを追加すれば確実に一覧に出てくるし、それ以上は何の設定も再起動も必要ない。
2007-06-06追記
上記はSubversion 1.3以前のノウハウになる。Subversion 1.3以降ではSVNListParentPath onで解決するらしい。まだ他にもWebDAVまわりで何かしら応用のしどころはあるはずだー、と悔し紛れに言ってみる。