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 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