19 February 2012

(Subversion) svnsyncを使ってリポジトリを複製

一般的なコピー方法の例

例として、レンタルサーバで稼動しているSubversionリポジトリを、Google CodeのSubversionにコピーする手順

20120219-svnsync.png
今回の概念図

レンタルサーバ側が、SSH接続で公開鍵認証方式、Google Codeはhttps接続。レンタルサーバ側の設定などは以前の記事「【さくらインターネット】 ユーザ権限でApache Subversionをインストール」の通りとなっている。

■ Google Codeの管理画面で、Subversionリポジトリをリセットする

Administer → Source → Reset this project's repository とメニューを辿って、

20120219-googlecode-reset.jpg

アンケートが表示されるので、正直に「svnsyncを使う」を選択するとリセットボタンが出現する。躊躇せずにボタンを押すと、リポジトリがリセットされる(trunkというディレクトリすら残らなくなる)。

■ リポジトリのコピー

ミラーリポジトリをソースリポジトリと関連付ける、初期管理情報を記録
svnsync init [送信先] [送信元]
ソースリポジトリからミラーリポジトリへ、保留中の全リビジョンを転送
synsync sync [送信先]

という順番でコマンドを実行する

# svnsync init https://HOGEHOGE.googlecode.com/svn/ svn+ssh.example://user@example.com/www/svn/MY_HOGEHOGE
 
Enter passphrase for key '/media/key/id_rsa': 
リビジョン 0 の属性をコピーしました。
 
# svnsync sync https://HOGEHOGE.googlecode.com/svn/
 
Enter passphrase for key '/media/key/id_rsa': 
ファイルのデータを送信しています ............................................................
リビジョン 1 をコミットしました。
リビジョン 1 の属性をコピーしました。
ファイルのデータを送信しています ............
リビジョン 2 をコミットしました。
リビジョン 2 の属性をコピーしました。
ファイルのデータを送信しています ........................
リビジョン 3 をコミットしました。
リビジョン 3 の属性をコピーしました。
ファイルのデータを送信しています ........
リビジョン 4 をコミットしました。
リビジョン 4 の属性をコピーしました。
ファイルのデータを送信しています ..........................................................................
リビジョン 5 をコミットしました。
リビジョン 5 の属性をコピーしました。

Google Codeはレスポンスが悪いので、ソースコードが転送されるのをひたすら待つ…。エラーがなければ、自動的に最新のリビジョンまでコピーされて終了する。

■ 参考資料
Subversion 完全リファレンス : svnsync

自分で構築したSubversionサービスで、svninitの受け入れを可能にする

通常、svninitなどでリポジトリの属性などを書き換えようとすると、

svnsync: warning: W200007: Target server does not support atomic revision property edits; consider upgrading it to 1.7 or using an external locking program
svnsync: E165006: リポジトリが、リビジョン属性を変更できるようにはなっていません。
管理者に pre-revprop-change フックを作成するよう頼んでください

というようなエラーや

svnsync: warning: W200007: Target server does not support atomic revision property edits; consider upgrading it to 1.7 or using an external locking program
svnsync: E165001: リビジョン変更が pre-revprop-change フックによって妨げられました (終了コード: 1)。出力:
Changing revision properties other than svn:log is prohibited

というようなエラーに遭遇する。

リポジトリの属性をリモートから書き換えられるようにするには、『(Subversion) ログメッセージを書き換えたり、svnsyncの同期先にする時の制限解除』に書いているように、リポジトリのディレクトリで、強制的に属性書き換えのためのpre-revprop-change hookファイルを作成し、内容を少しカスタマイズしてやれば良い。

# cd ~/var/svn/HOGEHOGE_REPO/hooks/
# cp pre-revprop-change.tmpl pre-revprop-change
# chmod +x pre-revprop-change
pre-revprop-change に次の1行を追加する
〜 略 〜
REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"
 
exit 0
 
if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
〜 略 〜