よりスマートな方法:svnsyncを使ってリポジトリを同期させる
svnsyncを使用すれば、Subversionリポジトリをもっと効率的にバックアップできます。この便利なツールはSubversion 1.4から導入されたもので、リビジョンを(コミット操作の一連の流れの中で)複製サーバーに送ります。複製サーバーは基本的に、送られてきた個々のコミットを自身が持つリポジトリのコピーに対して「リプレイ」します。この方法はリポジトリ全体を毎回バックアップするよりもはるかに効率的です。なぜなら、前回の同期以降に実行されたコミットに関するデータだけが伝送されるからです。さらに、svnsyncは標準のSubversionプロトコル(svn://
またはhttp://
)を使ってネットワーク経由で実行することもできます。
svnsyncのセットアップは簡単です。最初に必要なのは、利用可能な状態のSubversionリポジトリを2つ用意することだけです。1つは複製元となるリポジトリで、もう1つは空のリポジトリです。空のターゲットリポジトリは複製サーバー上に作成します。その際、他のSubversionリポジトリを作成するときと同じく、次のようなsvnadmin
コマンドを使用します。
$ svnadmin create /var/svn/repos-mirror
重要なのは、リビジョンデータがいっさい含まれていない状態のターゲットリポジトリを用意することです。原則的に、ターゲットリポジトリはsvnsyncのみが使用する読み取り専用リポジトリにします。このバックアップリポジトリをsvnsyncの処理とは別に更新しようとすると、Subversionが大いに混乱してしまいます。
この複製サーバーへのバックアップを開始する前に、複製サーバー側の設定を1つ変更する必要があります。同期プロセスの際に、svnsyncは複製サーバー上のリビジョンプロパティを更新しなければなりません。新規Subversionリポジトリでは、リビジョンプロパティの変更はデフォルトでアクティブになっていません。そこで、pre-revprop-change
フックスクリプトを記述してアクティブにする必要があります。これはそれほど難しい作業ではありません。ターゲットSubversionリポジトリのhooksディレクトリにサンプルのフックスクリプトテンプレートが含まれているので、実際に内容を見て、各スクリプトの働きを調べてみてください。
リビジョンプロパティを更新できるようにするには、ファイル「pre-revprop-change.tmpl」の名前を「pre-revprop-change」(UNIXの場合)または「pre-revprop-change.bat」(Windowsの場合)に変更し、必要であればこのファイルを実行可能にします。その後、このスクリプトを書き換えて、常に0を返すようにします。次に例を示します。
#!/bin/sh exit 0
これで、リビジョンプロパティに対する更新処理は、すべて例外なく許可されます。
次に、ターゲットリポジトリと同期するようにメインリポジトリをセットアップします。そのためには、次のコマンドを使用します。
$ svnsync init svn://svnmirror svn://svnrepos
このコマンドでは、svnreposリポジトリをsvnmirror上のリポジトリに同期させる準備をします。実際に同時を実行するには、次のようにしてsvnsync sync
を実行します。
$ svnsync sync svn://svnmirror Committed revision 1. Copied properties for revision 1. Committed revision 2. Copied properties for revision 2. Committed revision 3. Copied properties for revision 3. Committed revision 4. Copied properties for revision 4. Committed revision 5. Copied properties for revision 5. Committed revision 6. Copied properties for revision 6. Committed revision 7. Copied properties for revision 7. Committed revision 8. Copied properties for revision 8. Committed revision 9. Copied properties for revision 9. Committed revision 10. Copied properties for revision 10. ...
これが完了すると、ターゲットリポジトリにメインリポジトリのコピーが含まれている状態になります。