git svn 環境でのリポジトリ再配置 ( svn switch --relocate に代わる何か )

Subversion リポジトリの場所が変わった場合、

svn switch --relocate 旧リポジトリ 新リポジトリ

というコマンドで、リポジトリの再配置ができるのだけど、 Subversion リポジトリを git svn を使って管理している場合はどうすればいいのか分からなかったので調べてみた。

コマンドは存在しない

google 先生にお伺いを立ててみたところ、


というのは見つけた。どうやら、 svn switch --relocate に相当するコマンドはないらしい。

手順

ほとんど上記のサイトからの引用になるが、

  1. .git/config の URL を書き換える (旧リポジトリ -> 新リポジトリ)
  2. git svn fetch
  3. 1.で書き換えたURLを一旦元に戻す (新リポジトリ -> 旧リポジトリ)
  4. git svn rebase -l
  5. 再び 1. の書き換えを行う (旧リポジトリ -> 新リポジトリ)
  6. git svn rebase が動く

ただし、 2. で svn fetch をした際に、なにかしらの変更を取り込まないとうまく動かない


これは面倒。
面倒なモノは自動化してしまうに限る。

無いなら作ってしまえ

ということで、 git-svn-relocate なるコマンドを作ってみた。

git-svn-relocate 旧リポジトリ 新リポジトリ [git ディレクトリ]

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

で始まるくだりを削除すれば良いんじゃないかな。

最後に

一応免責。

利用する場合は自己責任でヨロ

それと、突っ込みどころあったら指摘してください

以上。