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を打つだけなんですが、ある分には気軽に作れて楽ですね。