svnsyncでミラーしているけど元のリポジトリを切り替える時 | kaneshun memo

kaneshun memo

技術ネタと日記で英語の練習

github 真っ盛りの昨今ですが2013年代でも まだ svn の資産は残っているわけで...
インフラ担当としては svn もちゃんとメンテできないといけないわけで...

というわけで svn ネタ

今回やんごとなき理由により,svnリポジトリを切り替えることになったので


1. 旧リポジトリへのcommit禁止
2. 各環境のsvn作業コピー(checkoutしたやつね)のリモート切替


で,この svnリポジトリってのが,これまたやんごとなき理由によって別環境に
svnsyncで定期的にミラーしていたので


3. ミラー先のリポジトリでミラー元を新リポジトリに変える


この3点の作業が必要になった.

1, 2は今までやったこともあるので非常に簡単だったんだけど
3 が初めてだったのでちょっと苦戦した,のでそのメモ

1. 旧リポジトリへのcommit禁止

「これからはcommitすんじゃねぇぞ!ボケカス」って利用者に言っても絶対の保証はされない
たとえその気はなくってもミスってcommitしちゃうとかあるよね,にんげんだもの

なので機械的に弾くようにする.svn の start.commit フックを使います
root@:~> touch /var/svn/repos/hooks/start.commit

#!/bin/sh

echo "This repository is already old, Commit Unavailable." 1>&2
exit 1

root@:~> chmod 755 /var/svn/repos/hooks/start.commit



2. 各環境のsvn作業コピー(checkoutしたやつね)のリモート切替

これは svn switch --relocate を使えば一発ですね

root@:~> svn switch --relocate http://oldrepo/repos/ http://newrepo/repos/  repos



3. ミラー先のリポジトリでミラー元を新リポジトリに変える

これが苦労した...
初期化する時はミラー元の情報入れるけど,その後 svnsync で同期させる時にはミラー先しか指定しない,
ということはミラー先のどこかにミラー元情報が入っているはず...だがなかなか見つけられなかった.

結局 ここの情報 を見てやっと分かった

リビジョン0のプロパティに入っていたとは...
確かに初期化時に「リビジョン0の属性をコピーしました」って出てたなぁ
というわけで,この属性を書き換えてあげればOKですね

root@:~> svnlook pg --revprop -r 0 /var/svn/repos svn:sync-from-url > repo.txt
root@:~> sed -e "s/oldrepo/newrepo/" repo.txt | tr -d "\n" > repo2.txt
root@:~> svnadmin setrevprop /var/svn/repos -r 0 svn:sync-from-url repo2.txt
root@:~> svnlook pg --revprop -r 0 /var/svn/repos svn:sync-from-url