svnsyncを使ってリポジトリレプリケーション

タグ:

バックアップとして、もしくはバックアップからの復旧時間が嫌な場合は、リポジトリのミラーリングとしてsvnsyncがSVN1.4から使えるようになっている。

今回はsvnsyncの動作を確認してみる。
環境はWindows Vista、SVN1.5.3。
本当はリモートのリポジトリにミラーリングしたいんだけど、ローカルApacheで我慢。

Apacheは↓みたいな設定でURLを別にしている。SVNのBasic認証もかけてみた。

 <Location /svn>
   DAV svn
   SVNListParentPath on
   SVNParentPath C:\fujihara\svn_root
   AuthType Basic
   AuthName "Subversion Basic Auth"
   AuthUserFile C:\fujihara\svn_root\passwd
   Require valid-user
 </Location>
 
 <Location /svnmirror>
   DAV svn
   SVNListParentPath on
   SVNParentPath C:\fujihara\svn_mirror
   AuthType Basic
   AuthName "Subversion Basic Auth"
   AuthUserFile C:\fujihara\svn_root\passwd
   Require valid-user
 </Location>

「http://localhost:8888/svn/repo01」と「http://localhost:8888/svnmirror/repo01m」を同期させる。


ミラー側のリポジトリ設定

まずはミラー先のリポジトリを作成する。
mkdir c:\fujihara\svn_mirror
 cd c:\fujihara\svn_mirror
 svnadmin create repo01m

次に「C:\fujihara\svn_mirror\repo01m\hooks」にある「pre-revprop-change.tmpl」を「pre-revprop-change.bat」、「start-commit.tmpl」を「start-commit.bat」にリネーム。Windowsの場合はbatでUnixだとtmpl拡張子を削除かshとかでもいいかも。
バッチファイルの中身を以下に修正。

 // pre-revprop-change.bat
 if "%3" == "svnsyncuser" exit 0
 exit 1
 // start-commit.bat
 if "%2" == "svnsyncuser" exit 0
 exit 1

これをしないと

svnsync: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook

と怒られる。この記述によって、svnsyncuserからしかアクセスができないようになるので、ミラー側に送られてきたコミットやリビジョンのログメッセージ変更を防ぐ。

次にミラー側のリポジトリを初期化。
ミラー側のリポジトリは空っぽでないと「svnsync: Cannot initialize a repository with content in it」と怒られるので注意。

 c:\fujihara\svn_mirror>svnsync init http://localhost:8888/svnmirror/repo01m  http://localhost:8888/svn/repo01 --non-interactive --source-username=fujihara --source-password=password --sync-username=svnsyncuser --sync-password=password
Authentication realm: Subversion Basic Auth
Username: fujihara
Password for 'fujihara': ********
Copied properties for revision 0.

svnsyncuserはsvnsync用のユーザをApacheで指定したファイル(今回はpasswd)に追加する。こればっかりは平文になりますなー。

最後にsvnsyncコマンドでレプリケーション開始。

 c:\fujihara\svn_mirror>svnsync sync file:///c:/fujihara/svn_mirror/repo01m --sync-username=svnsyncuser --sync-password=secret
 Committed revision 1.
 Copied properties for revision 1.
 Committed revision 2.
 Copied properties for revision 2.
 Transmitting file data .
 Committed revision 3.
 Copied properties for revision 3.

これでばっちりレプリケーションができた。


ローカルでのミラーリング

ローカルのディスクにsvnsyncしてみる。svnsyncはURI?でレプリケーション先を設定できるので、リモートであろうがローカルであろうが意識しなくていい。
ローカルディスクにリポジトリを配置し、NFS上にレプリケーションを作成する・・・という構成にも可能。
 c:\fujihara\svn_mirror>svnadmin create repo01ml
 c:\fujihara\svn_mirror>svnsync init file:///c:/fujihara/svn_mirror/repo01ml file:///c:/fujihara/svn_root/repo01
 c:\fujihara\svn_mirror>svnsync sync file:///c:/fujihara/svn_mirror/repo01ml

リモート&リモートでもできた。

 c:\fujihara\svn_mirror>svnsync init http://localhost:8888/svnmirror/repo01mr http://localhost:8888/svn/repo01
 c:\fujihara\svn_mirror>svnsync sync http://localhost:8888/svnmirror/repo01mr


マスタとなるリポジトリの設定

ミラー側では以下の設定を行う。今回はrepo01リポジトリを複製しようとしているので、「C:\fujihara\svn_root\repo01\hooks\post-commit.bat」を作成する。これはコミット後に処理されるスクリプトなので、
svnsync sync http://localhost:8888/svnmirror/repo01m --non-interactive --source-username=fujihara --source-password=password --sync-username=svnsyncuser --sync-password=password

と記述してコミット毎に同期させる。コミット毎が2回走るのに近いので、軽くするんだったらcronとかに同じ内容を書けば、まとめて同期することも可能。
source-userとsource-passwordはなくても動くので謎。マスタ側のSVNユーザを指定するのかな?
Apacheで認証かけているときはオプションをちゃんと付けないとよくわからないエラー(MERGE of ・・・ 200 OKとか)になったり、ロック状態におちいるので注意。ロック状態の解除はsvnsyncでFailed to get lock on destination repos, currently held by・・・を参照のこと。

またコミットメッセージなどのリビジョンのプロパティも同期させないとだめなので、「C:\fujihara\svn_root\repo01\hooks\post-revprop-change.bat」を作成し、

svnsync copy-revprops http://localhost:8888/svnmirror/repo01m %2 --non-interactive --source-username=fujihara --source-password=password --sync-username=svnsyncuser --sync-password=password

と記述する。


動作確認

成功。コミット毎に同期も可能だし、あとでsvnsyncコマンドをたたいてまとめて同期も可能。ミラー側のリポジトリのコミットやログ変更もはじいてくれた。すばらしー。


参考

参考

バージョン管理システム「Subversion」の開発者が執筆したSubversi... 続き
Subversionの導入から運用まで、即戦力の一冊。最短距離で目的にたどり着け... 続き
バージョン管理からプロジェクト管理へ。Subversionでコミットするだけ。W... 続き
この本は、Subversionというバックアップのためのソフトについて説明したも... 続き

トラックバック(0)

このブログ記事を参照しているブログ一覧: svnsyncを使ってリポジトリレプリケーション

このブログ記事に対するトラックバックURL: http://daipresents.com/mt/bin/mt-tb.cgi/1656

コメントする


画像の中に見える文字を入力してください。

著者:Venkat Subramaniam, Andy Hunt, Shane Warden 税込2,520円
アジャイルの核心となるプラクティスについての、包括的かつ焦点の定まった簡潔な要約。特定のアジャイルな方法論を押し付けるのでなく、いろいろな方法論に共通するプラクティスを結びつけ、首尾一貫した全体像を描き出している。
著者:Yugui 税込 2,310 円
他言語でのプログラミング経験を持つ人を対象に、Rubyの特徴、Rubyならではの方法や慣習について解説。Rubyの基礎的な部分とメタクラスやブロック構文のような独自の概念、それらにまつわる文化を説明し、Ruby特有の考え方を知ってもらうことを目的としている。Ruby1.8及び1.9に対応している。 「BOOK」データベースより
著者:前田剛 税込 2,100 円
RubyonRailsで実施されたWebベースのプロジェクト管理システムRedmaineの解説書。

daipresents!!

҂̑蕨

tWn{ Google Code