一般的なコピー方法の例
例として、レンタルサーバで稼動しているSubversionリポジトリを、Google CodeのSubversionにコピーする手順
今回の概念図
レンタルサーバ側が、SSH接続で公開鍵認証方式、Google Codeはhttps接続。レンタルサーバ側の設定などは以前の記事「【さくらインターネット】 ユーザ権限でApache Subversionをインストール」の通りとなっている。
■ Google Codeの管理画面で、Subversionリポジトリをリセットする
Administer → Source → Reset this project's repository とメニューを辿って、
アンケートが表示されるので、正直に「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
〜 略 〜
REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"
exit 0
if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
〜 略 〜