git-svnでリモートリポジトリのブランチにコミットする

ふつうに使ってるのですが、そういえばメモしてなかったなーと思い、なんとなくメモしておく。

ちょっとBKなんですがもっとスマートなやり方はないものか。。。

$ git checkout -b working_branch
$ git svn info # => trunkのURLになる
# 何かしら作業する
$ git commit -a
$ git commit -a
$ git commit -a
# svnにremote branch 作る
$ git svn branck new_remote_branch # svn copy trunk branch とほぼ同様
$ git checkout new_remote_branch -b worknig_branch_remote
$ git svn info # => branches/new_remote_branchのURLが出る
$ git merge --no-ff working_branch # --no-ffをつけるのがポイント
$ git svn dcommit # リモートブランチへ反映

# 元の作業を進める
$ git checkout working_branch
$ git commit -a
$ git commit -a
$ git checkout new_remote_branch
$ git svn merge --no-ff worknig_branch
$ git svn dcommit

# trunkにmergeできるまで作業したらtrunkへもcommitする
$ git checkout workning_branch
$ git svn dcommit 

trunk側の変更をremoteブランチ側の変更にmergeするときに--no-ffをつけてfast-forwardさせないのがポイント。fast-forwardしてしまうと、remote側にmergeコミットが発生しなくてremote側をdcommitするときにうまく判別できなくなるらしい。svnのログ的にはMergeなんちゃらの部分だけがリモートにコミットされるっぽいです。詳細なコミットログもremoteにdcommitしたときに出したいのであれば、git format-patchとかでtrunkとのdiffを取ってからremote側のbranchにapplyするといった感じでしょうか。(やったことないですが)

基本的には、working_branchで作業しつつ、他に人に見せたりとかしたいときだけ、new_remote_branch側に入れたりします。working_branchは別になくてもできなくはないんですが、後からtrunk側に戻すときにworking_branchでgit svn dcommitするだけで済むので楽です。

git svn branchは確か割と最近入ったコマンド(RelNoteによると、1.6.1かららしい)なので、gitのHEADを追いかけてないとなかったりします。まぁ単にsvn copyを打つだけなんですが、ある分には気軽に作れて楽ですね。