インフラ担当としては 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