gitのリポジトリをSubversionに変換する

gitで始めたプロジェクトをSubversionのリポジトリにしたかったのだが、どうやったらいいのか調べてもよくわからない。
Subversionからgitはよくあるのにねー。


試行錯誤の結果とりあえずうまくいったっぽいので記録を残しておく。
これで大丈夫なのかどうかはよくわからない。
きっとid:bleis-tift先生がなんとかしてくれるハズ!

gitからSubversionへ

移行先となる新しいSubversionリポジトリを用意する。

svnadmin create foo

んで、コミットがないとうまくいかない感じだったのでtrunk,branches,tagsを作っておく。

svn checkout http://localhost/svn/foo foo
cd foo
mkdir {trunk,branches,tags}
svn commit -m "init"

なんかfileスキームだとgit-svnがうまく動いてくれなかったのでDAVで動かした。sshとかでもいけるのかな?


続いて移行用のgitリポジトリをgit-svnで作る。

git svn clone -s http://localhost/svn/foo foo-migrate

masterはそっとしておいて、作業用のブランチに元のリポジトリ(ここでは/path/to/orig)の内容を取ってくる。

git checkout -b migration
git pull --rebase /path/to/orig

pull --rebaseじゃないとSubverionのinitが最後に来ちゃうみたいなので。
しかしこうするとSubverionのコミットが無くなるので、改めてrebaseする。
こんなことしていいのかよくわからない。

git rebase master

これでようやく期待通りのツリーになったので、masterに戻ってmergeしてdcommitする!

git checkout master
git merge migration
git svn dcommit

これでSubversionのリポジトリに今までの歴史を反映することができた!
あとはこのままリポジトリを使うも良し、改めてgit svn cloneするもよし。


とまあこんな感じでいちおう移行はできたみたい。
ブランチやタグはgitではまだ通常の運用もしたことがないので移行のしかたはわからない。
あと後半がなんかぐだぐだな感じで改善の余地があるような気がする。

format-patchを使った方法

上記の方法はいまいち確信が持てないので、もしかしたらformat-patchを使った方法のほうが安全かもしれない。


やり方としてはgit svn cloneするところまでは同じで、その後元のリポジトリをリモートに登録してパッチを作る→適用するという流れになる。

git svn clone -s http://localhost/svn/foo foo-migrate
git remote add orig /path/to/orig
git fetch orig

パッチを作ってすかさず適用。

git format-patch -o ../foo-patches master..orig/master
git am ../foo-patches/*.patch

無事に適用できたらSubversionへdcommit!

git svn dcommit