SVN サーバを別 PC へ移行

Posted Wed Mar 12 2014

会社で Windows 7 への全社的な移行作業を行っており,SVN サーバの移行を行いました.今まで使っていた SVN サーバが XP で古いため廃棄し,新しい Windows 7 PC に移行しました.作業内容をまとめておきます.

SVN サーバ構成

うちのチームの SVN サーバの構成は下記のようになっています.Apache 2.2 と Subversion 1.8 で構成した SVN サーバがあり,svnsync を使い社内サーバへ定期的にバックアップを行っています.それと並行して NAS にもバックアップを行っています.こちらは Buffalo の NAS を使用しているのですが,付属ソフトの Nas Navigator 2 を使い,フォルダを同期しています.冗長ですが,さらに NAS に外付けの HDD を接続し,そちらに NAS のデータをバックアップしています.NAS と外付け HDD にはリポジトリ以外の共有データも保存しています.

svn_server_configuration

今回は中央の SVN サーバを新しい PC に置き換えた時の話です.

Apache & Subversion のインストール

新しい Windows 7 PC に Apache と Subversion をインストールします.ここ から Apache HTTP Server をダウンロードしインストールします.2.4 系は2.2 系と設定ファイルが変わっているとのことで,今回は 2.2 をインストールしました.インストールフォルダは移行前と変えない方が変更が少なくて済みます.

次に ここ から Subversion をダウンロードしインストールします.Subversion のバイナリ配布パッケージは色々なのがあるので,他の物をインストールする場合は ここ からインストールする物を選んでください.

設定ファイルの更新

下記の部分のコメントをはずします.

LoadModule dav_module modules/mod_dav.so

下記の部分を追記します.パスは Subversion をインストールしたフォルダを指定します.

LoadModule dav_svn_module "C:/svn/Subversion/bin/mod_dav_svn.so"
LoadModule authz_svn_module "C:/svn/Subversion/bin/mod_authz_svn.so"

httpd.conf の Location 部分を移行元からコピーします.ローカルのリポジトリの場所が変わる場合には SVNPath を編集します.

<Location /repository/test-project>
    DAV svn
    SVNPath d:/svn/repository/test-project
    AuthType Basic
    AuthName "test project"
    AuthUserFile d:/svn/repository/test-project
    Require valid-user
</Location>

リポジトリの移行

リポジトリの移行は dump/load で行います.

$ svnadmin dump /path/to/old/repository > /path/to/dump

移行先の PC でリポジトリを作成し load を行います.

$ svnadmin create /path/to/new/repository
$ svnadmin load /path/to/new/repository < /path/to/dump

一部のリポジトリで load 時に下記のエラーが発生しました.バージョン1.6から導入されたログの文字コードチェックに関する問題で,改行コードが LF で終わっていないために発生しているようです.

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

このエラーが発生した場合には,リポジトリのロードが途中で止まっていると思うので,もう1度途中から dump をしなおして,load 時のオプションに --bypass-prop-validation をつけて load しなおしました.例えば最新リビジョンが150で60までしか load されていなかった場合には下記のようにします.

$ svnadmin dump /path/to/old/repository -r 61:150 --incremental > /path/to/dump
$ svnadmin load --bypass-prop-validation /path/to/new/repository < /path/to/dump

今回の移行では特に古いリポジトリで発生していました.バッチファイルなどで複数のリポジトリを一括で load していると,エラーが途中で発生しているか分からないので注意が必要です.もしくは最初から --bypass-prop-validation のオプションを付けておくのもいいかと思います.

今回は単純にエラーをスキップしてしまいましたが,下記のリンクに別の対処法などまとまっています.

svnsync はバックアップ用

最初 svnsync でできるかと思ってやったのですが,svnsync はあくまでバックアップ用に同期するコマンドみたいです.上記のネットワークに移行先の PC を接続し,svnsync で移行したいリポジトリに対してコミットを行った後,そのリポジトリをファイルサーバに svnsync しようとすると,下記のようなエラーが発生します.

svnsync: E000022: 同期先の HEAD (101) が最後にマージされたリビジョン (100) ではありません。svnsync を用いずに同期先リポジトリにコミットしたのではありませんか?

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

社内のファイルサーバに svnsync でバックアップを取っていますが,サーバの url が変わるため,svnsync の同期設定を変更します.url のみを変えることもできるようですが,今回 Windows で下記の url 変更をしようとしたのですが,うまくできなかったので,今回はいったん全部消して,同期しなおしました.

リポジトリの作成

同期先にてリポジトリを作成します.

mkdir repository
mkdir "repository/test-project"
svnadmin create "repository/test-project"
COPY pre-revprop-change.bat "repository/test-project"

pre-revprop-change.bat の中身は下記のようになっています.

exit 0

リポジトリの同期元の設定

svnsync init --username syncuser --password syncuser --no-auth-cache file:///D:/svn/repository/test-project http://svnserver-old/repository/test-project

リポジトリの同期

svnsync sync --username syncuser --password syncuser --no-auth-cache file:///D:/svn/repository/test-project