スパゲッティコード

色々やりたいので書いてこうと思います

git svn で取り込んだブランチとかタグのお話

git-svnを使用してSVNからGitに移行した時、SVNでいうところのtrunkやらbranchesやらtagsを指定します。
今回は取り込んだあとのお話。
特にタグの話。

git-svnのコマンド

最初にSVNからcloneするわけですが、ログが多い場合途中でミスるケースがあります。
これがイヤなので、一度初期化してfetchするといいと思います。

よく紹介されてるコマンド

$ git svn -s [URL] hoge

オススメコマンド

$ mkdir hoge
$ cd hoge
$ git svn init -s [URL]
$ git svn fetch

-s は、オーソドックスなルートディレクトリ以下が trunk, branches, tags の構成になっている場合のオプションになります。
ちなみに、ここでブランチ名のプレフィクスもつけられます。

$ git svn init --prefix svn/ -s [URL]

わかりやすいようにつけといた方が良いと思います。

trunkのお話

trunkで指定した場所はそれがGitブランチのmasterブランチになります。
もし移行時にメインで動かしているブランチがtrunkではなくブランチ分けてた場合、
まあ普通はtrunkにマージするんだろうと思いますが、そうしないでそのまま行く場合は、
trunkにそのブランチを指定してください。

$ git svn init --trunk branches/develop [URL]

こうすると、リモートリポジトリ名がtrunkになります。
また、fetch後のmasterはリモートリポジトリのtrunkのものになります。
まあ大して変わらないので、ブランチのまま取り込んであとからmasterにマージでも全然かまわないと思います。。。

branchesのお話

branchesは複数指定できます。
例えば、階層が深くなって複雑になっている場合に指定します。

$ git svn init --prefix svn/ --trunk trunk \
> --branches branches/user2/experiment1 \
> --branches branches/usr \
> [URL]

ここで指定したブランチは普通にGit上でリモートブランチとして認識されます。

tagsのお話

tagsは、タグといいつつGit上ではリモートブランチになります。
たしかに、SVN的にはただのブランチですもんね。
(少なくともリポジトリブラウザ的なものでの見た目は…)
そんなわけで、SVN上のtagsが以下のようになっているとしましょう。
tags
  |- ver1.1   |- ver1.0
  |- ver1.2
  |- ver2.0

これを取り込みます。

$ git svn init --tags tags [URL]

こうすると、ver1.1などのリモートブランチができちゃいます。
なので、ここから本当にタグにしたい場合は、

$ git tag ver1.1 remotes/ver1.1

とこんな感じで地道にタグ打ちしてください。
また、SVN上ではタグ分けした時点でそのブランチのコミットは止まって
以降のブランチとは独立したものになってしまうので、
Gitのリビジョングラフを見ると完全にそこで途切れているように見えると思います。
そこはしょうがないと言うことで…。
実際そうなんだし…。