svnsync

Subversion 1.4.0から導入されたsvnsyncを触ってみた。

svnsyncは、リポジトリレプリケーションを行うためのツールである。


C:\>svnsync help
一般的な使用方法: svnsync <サブコマンド> <同期先 URL> [<引数やオプション> ...]
特定のサブコマンドに関するヘルプを読みたいときは 'svnsync help <サブコマンド>'
と打ってください。
プログラムのバージョンや RA モジュールを参照するには 'svnsync --version' と打っ
てください。

利用可能なサブコマンド:
initialize (init)
synchronize (sync)
copy-revprops
help (?, h)

サブコマンドが少ない。それなりに簡単に扱えそうなツールだ。

まず、同期先リポジトリを作る。このリポジトリはコミット回数がゼロで、かつリビジョンプロパティの更新が可能でなければならない。pre-revprop-changeを用意すべし。

svnsyncコマンドの出番。最初にinitサブコマンドを使ってレプリケーション用に初期化する。


C:\>svnsync init file:///c:/svnrepos/repli file:///c:/svnrepos/main
リビジョン 0 の属性をコピーしました。

続けて、svnsync syncを叩く。


C:\>svnsync sync file:///c:/svnrepos/repli
リビジョン 1 をコミットしました。
リビジョン 1 の属性をコピーしました。
リビジョン 2 をコミットしました。
リビジョン 2 の属性をコピーしました。
リビジョン 3 をコミットしました。
リビジョン 3 の属性をコピーしました。
リビジョン 4 をコミットしました。
リビジョン 4 の属性をコピーしました。

と、複製される。ここでリビジョン4までコピーされていることは同期先リポジトリが覚えていて、次回svnsync syncした場合は、その続きから複製される。


C:\>svnsync sync file:///c:/svnrepos/repli
リビジョン 5 をコミットしました。
リビジョン 5 の属性をコピーしました。
リビジョン 6 をコミットしました。
リビジョン 6 の属性をコピーしました。

これをスケジューラに食わせておけば、お手軽にバックアップリポジトリができるわけである。レプリケーションsvn commitを使っているらしい、つまりSVNトランザクション管理下の操作になるので、ホットバックアップもたぶん大丈夫。

ところで、svnsync help initすると出てくるメッセージに、下記のくだりがある。

同期先リポジトリには、'svnsync' 以外の手段でコミットやリビジョン属性変更をすべきではありません。すなわち、同期先リポジトリは同期元リポジトリの読み取り専用のミラーとすべきです。

・・・勝手にコミットしたらどうなるんですかね?(悪)
同期先リポジトリのリビジョンをいっこ上げてみましたよ。


C:\svnrepos>svnsync sync file:///c:/svnrepos/rep
svnsync: 同期先の HEAD (7) が最後にマージされたリビジョン (6) ではありません。svnsync を用いずに同期先リポジトリにコミットしたのではありませんか?

お見通しですかorz
そりゃ、警告書いておきながら対策しないほど間抜けじゃないわな。

・・・で、では、リビジョンプロパティを変えてみたらどうなるか。


C:\>svn propset -r7 svn:log "hogehoge" --revprop file:///c:/svnrepos/main
属性 'svn:log' がリポジトリのリビジョン 7 に設定されました
C:\>svnsync sync file:///c:/svnrepos/repli

C:\>

なにも起きない。ということは・・・。


C:\>svnlook log -r7 c:/svnrepos/repli


C:\>svnlook log -r7 c:/svnrepos/main
hogehoge

コピーされていない。どこまで複製したかはリビジョンで管理しているから、その管理対象外になるリビジョンプロパティまでは面倒見切れないわけか。そうか、それでsvnsync copy-revpropsがあるんだな。


C:\>svnsync copy-revprops file:///c:/svnrepos/repli 7
リビジョン 7 の属性をコピーしました。

C:\>svnlook log -r7 c:/svnrepos/repli
hogehoge

なるほど。おおむね把握した。普通に運用しているぶんはぜんぜん問題なく動きそうだ。分散開発に使うようなものではないが、少なくともバックアップの作成は楽になる。

リビジョンプロパティの変更への対処が悩みどころだが、リポジトリに記録されないから後からログをあさってもなにもわからない。pre-revprop-changeでログ出力しておいて、あとでそいつを解析してsvnsync copy-revprops・・・あぁ、面倒くさい。リビジョンプロパティの書き換えなんてそうそう起きることじゃないから、忘れてしまおう!っていうか、あんな怖いデータの書き換えなど許してはいけない!

おまけ=バージョン間の互換性について。
同期先URLで指定する先には、任意のバージョンのSVNサーバが上がっていれば良い。これに対して、同期元URLで指定する方は、1.4以降のSVNサーバでなければならない。