Subversionのリポジトリ移行

サーバのリプレースのために、Subversionのリポジトリごと引っ越した時のメモ。
単純にdump -> loadではうまく行かなかったので、他の方にも参考になれば。
ここでは、移行先のサーバOSはCentOS5.6、すでにApache2.2.21がソースからインストール済みであることを前提に手順を書いています。



1. 移行元サーバでリポジトリのをダンプ出力
まず、移行元のサーバで既存のリポジトリをダンプを取得する。
# svnadmin dump /usr/local/svn-repository/example-rep \
> | gzip > /tmp/ example-rep.dump.gz
2. 移行先サーバにダンプファイルを転送
scpなどでexample-rep.dump.gzを移行先サーバに転送する。
3. 移行先サーバにSubversionをインストール
Subversionのインストールに必要なものを予めインストールしておく。
# yum install libxml2-devel expat-devel
Subversionをインストールする。
# cd /usr/local/src
# tar xvfz subversion-1.7.4.tar.gz
# cd subversion-1.7.4
# wget http://www.sqlite.org/sqlite-autoconf-3071100.tar.gz
# tar xvfz sqlite-autoconf-3071100.tar.gz
# mkdir sqlite-amalgamation
# cp -dpR ./sqlite-autoconf-3071100/sqlite3.c \
/usr/local/src/subversion-1.7.4/sqlite-amalgamation/sqlite3.c
# ./configure \ --prefix=/usr/local/subversion-1.7.4 \
--with-apr=/usr/local/httpd-2.2.21/bin/apr-1-config \
--with-apr-util=/usr/local/httpd-2.2.21/bin/apu-1-config \
--with-apxs=/usr/local/httpd-2.2.21/bin/apxs \
--without-berkeley-db \
--with-zlib
# make && make install
4. Apacheモジュールのビルド
SubversionにHTTPでアクセスするため、Apacheのモジュールをインストールする。
Apache 2.2 にmod_davを後から追加する方法(抜粋)に書かれているように、apxsの引数に注意が必要。
# cd /usr/local/src/httpd-2.2.21/modules/dav/main
# /usr/local/httpd/bin/apxs -cia -n dav mod_dav.c \
> liveprop.c props.c providers.c std_liveprop.c util.c util_lock.c
# cd /usr/local/src/httpd-2.2.21/modules/dav/fs
# /usr/local/httpd/bin/apxs -cia -n dav_fs mod_dav_fs.c dbm.c lock.c repos.c
5. httpd.confの修正
httpd.confを開き、以下の順でモジュールをロードする。
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
Locationディレクティブを追加し、HTTPでアクセスできるようにする。必要であれば、以下のようにBASIC認証の設定も追加し、.htpasswdを作成しておく。
<location subversion="/subversion">
SVNParentPath /usr/local/svn-repository
AuthType Basic
AuthName "Basic Auth"
AuthUserFile /usr/local/httpd/conf/.htpassw
Require valid-user
</location>
6. Apache 設定確認、再起動
apachectl configtestを実行し、エラーがないことを確認したうえでApacheを再起動する。
# /usr/local/httpd/bin/apachectl configtest
# /usr/local/httpd/bin/apachectl graceful
7. 移行先サーバにリポジトリを作成
移行先サーバにダンプを取り込むためのリポジトリを作成する。
# /usr/local/subversion-1.7.4/bin/svnadmin create /usr/local/svn-repository/example-rep
8. リポジトリをリストア
移行元から取得したダンプをロードする。
# zcat example-rep.dump.gz | /usr/local/subversion-1.7.4/bin/svnadmin load /usr/local/svn-repository example-rep/
ダンプリストア時に以下のエラーが発生する場合がある。
svnadmin: E125005: Invalid property value found in dumpstream; consider repairing the source or using --bypass-prop-validation while loading. svnadmin: E125005: Cannot accept non-LF line endings in 'svn:log' property
コミットログを入力したときの改行コードの問題のようなので、移行元のリポジトリに対し、問題を修正するスクリプトを実行する。
pre-revprop-changeフックが実行できるよう、テンプレートから実行ファイルを用意する。
# cp -dpR /usr/local/svn-repository/example-rep/hooks/pre-revprop-change.tmpl \
> /usr/local/svn-repository/ example-rep/hooks/pre-revprop-change
# chmod 755 /usr/local/svn-repository/example-rep/hooks/pre-revprop-change
以下のスクリプトを移行元サーバの適当な場所に作成し実行する。
SubversionへのアクセスにBASIC認証を設定している場合は、--usernameと--passwordでそれぞれ必要な情報を記述する。
#!/bin/sh
rev=1 repo=/usr/local/svn-repository/example-rep/
URL=http://www.example.com/subversion/example-rep/

while [ $rev -lt `svnlook youngest $repo` ]
do
echo revision $rev
svn pget svn:log --username hogehoge --password=foobar --revprop -r $rev $URL > /tmp/svn$$.log
svn pset svn:log --username hogehoge --password=foobar --revprop -r $rev --file /tmp/svn$$.log $URL
rev=`expr $rev + 1`
done
スクリプト実行後、再度「1. 移行元サーバでリポジトリのをダンプ出力」の手順でダンプを取得し、移行先サーバで「8 .リポジトリをリストア」の手順を実行する。
参考情報