git svn 環境でのリポジトリ再配置 ( svn switch --relocate に代わる何か )
Subversion リポジトリの場所が変わった場合、
svn switch --relocate 旧リポジトリ 新リポジトリ
というコマンドで、リポジトリの再配置ができるのだけど、 Subversion リポジトリを git svn を使って管理している場合はどうすればいいのか分からなかったので調べてみた。
コマンドは存在しない
google 先生にお伺いを立ててみたところ、
- [git][svn]git-svn使用時におけるsvnリポジトリの移行 ( http://d.hatena.ne.jp/walf443/20090811/1250005053 )
- git svn での switch のやりかた ( http://d.hatena.ne.jp/naga_sawa/20110306/1299422744 )
というのは見つけた。どうやら、 svn switch --relocate に相当するコマンドはないらしい。
無いなら作ってしまえ
ということで、 git-svn-relocate なるコマンドを作ってみた。
git-svn-relocate 旧リポジトリ 新リポジトリ [git ディレクトリ]
うまくいけば、 svn switch --relocate のようにベースとする Subversion リポジトリの再配置をしてくれる。
fetch 時に変更がない場合は、旧リポジトリに書き直して終了するようにしているので、新リポジトリになにかしらの変更を加えてから再実行すればいい。
git-svn-relocate
#!/bin/sh GIT_CONFIG='.git/config' OLD_REP=$1 NEW_REP=$2 WORKSPACE=$3 # show usage if [ -z "$OLD_REP" -o -z "$NEW_REP" ]; then echo "git-svn-relocate OLD_REPOSITORY NEW_REPOSITORY [GIT_WORKSPACE]" exit 1 fi # change woking directory if [ $WORKSPACE ]; then cd $WORKSPACE if [ 0 -ne $? ]; then echo "invalid git workspace" exit 1 fi fi # git config file is exists? if [ ! -f $GIT_CONFIG ];then echo "not exists $GIT_CONFIG" exit 1 fi # check old repository grep $OLD_REP $GIT_CONFIG > /dev/null if [ 0 -ne $? ]; then echo "url not found (invalid old repository)" exit 1 fi # check current branch RET=`git branch| grep master | grep '*'` if [ -z "$RET" ]; then echo "not master branch" exit 1 fi # check git index RET=`git diff` if [ "$RET" ]; then echo "dirty workspace..." exit 1 fi # start relocation echo "rewrite url $OLD_REP -> $NEW_REP" sed -i -e "s|$OLD_REP|$NEW_REP|" $GIT_CONFIG RET=`git svn fetch` if [ 0 -ne $? -o -z "$RET" ]; then echo "revert url $NEW_REP -> $OLD_REP" sed -i -e "s|$NEW_REP|$OLD_REP|" $GIT_CONFIG if [ -z "$RET" ]; then echo "empty fetch from new repository." else echo "invalid repository?" fi exit 1 fi echo "rewrite url $NEW_REP -> $OLD_REP" sed -i -e "s|$NEW_REP|$OLD_REP|" $GIT_CONFIG git svn rebase -l echo "rewrite url $OLD_REP -> $NEW_REP" sed -i -e "s|$OLD_REP|$NEW_REP|" $GIT_CONFIG echo "repository relocation is completed"
master ブランチでのみ実行を許可している。
これは、自分の運用上 master 以外で git svn rebase する事がないため
他のブランチで実行したい場合は、
# check current branch
で始まるくだりを削除すれば良いんじゃないかな。
最後に
一応免責。
利用する場合は自己責任でヨロ
それと、突っ込みどころあったら指摘してください
以上。