ここをキャンプ地とするブログ

いきあたりばったり

git-svn で svn の mergeinfo を残す

svn リポジトリのマージを git-svn で普通にやったところ mergeinfo がのってなくて
別のところで svn merge しようとしたときに現チーム三大奇祭のひとつ、
大衝突祭りが盛大に行われてしまった
あと2つは大コミット祭りと大補填対応祭り

git-svn から mergeinfo を載せる方法を調べたら意外と難しかったのでメモってみる

要点は2つ

  • git のマージは対応するリモートリポジトリ情報も上書きしてしまうっぽい
  • git rebase(というかFastFoward)はマージではない。ので mergeinfo は出てこない

svn リポジトリの branches/b0 を trunk にマージする場合
  1. git-svn が mergeinfo を吐く設定にしとく
  2. git config --global svn.pushmergeinfo true
  3. ワーキングツリーを remote/trunk に対応した master にしとく
  4. remote/b0 (か、対応したローカルブランチ b0)をマージ
    1. この段階で master のリモートブランチが remote/b0 になっちゃう模様
  5. git reset --soft で HEAD を trunk の位置に戻す
    1. これで対応リモートブランチが remote/trunk になる
  6. dcommit で svn リポジトリに反映

4. の時に rebase など FastForward しちゃうと、
変更を追加した(=マージではない)ということで mergeinfo は吐かれない模様
git 上でも別ツリーの変更がマージされた歴史になってないといけないみたい

git の思想を理解してればなんてことはないのかもしれないけど、なかなか難しい><

参考