- Published on
SVN サーバを別 PC へ移行
- Authors
- Name
- Daisuke Kobayashi
- https://twitter.com
会社で 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 サーバを新しい 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