git-svn使用時におけるsvnリポジトリの移行

svnリポジトリを別のサーバーに移して、

svn switch --relocate svn+ssh://old.example.com/path/to/project svn+ssh://new.example.com/path/to/project

みたいなのでワーキングコピーを切り変えるようなケースをgit-svnでやってみたメモ。

まず.git/configの、svn-remoteセクションを書き変える。

例えば、こうなっていた場合、

[svn-remote "svn"]
  url = svn+ssh://old.example.com/path/to/
  fetch = project/trunk:refs/remotes/trunk
  branches = project/branches/*:refs/remotes/*

urlの部分を書き変えて、

[svn-remote "svn"]
  url = svn+ssh://new.example.com/path/to/
  fetch = project/trunk:refs/remotes/trunk
  branches = project/branches/*:refs/remotes/*

のようにする。

次に、git svn fetchして、新しいリポジトリでの変更を取得する。

まだsvnリポジトリに戻していない変更がある場合は、ここで、git-format-patch HEAD^^^とかしてパッチを作っておく。

最後に各ブランチで、

git reset --hard trunk

すれば、ふつうに新しいパスで、trunkに対して、dcommit, rebaseできるようになる。

あとは、取っておいたパッチをgit applyで順番に当ててcommitしてdcommitすれば新しいサーバーの方へcommitを戻せる。

注意しないといけないのは、git svn fetchする段階で、新しい変更が取りこまれるようにしないといけないことで、新しい変更を取りこんでgit resetかけるまではrebaseもdcommitもできない。

なお、git-svn version 1.4.4.4で検証していて、それより古い、あるいは新しいバージョンではうまくいかない可能性も結構高い方法な気もする。

まぁgit-svn cloneしなおすと時間かかるしその前にちょっと試してみるくらいに覚えておくとよいかもしれません。

たぶん正規の方法ではないので、最悪手元のリポジトリは破壊されてもいいやというくらいの気持ちでやった方がよいです。