git-svn で trunk/branch を扱う時の話(暫定)

Subversion で管理されているファイル群を git で利用する際、Subversion 側の trunk, branch を扱う際のフローの現在までのまとめ。まだがっちり運用に至ってないので、若干の手直しが入る可能性もあり。

なおここでは Piece_ORM を例に。あと、git 云々の話はここでは触れない。(まだよーわかってないけど。)

clone 時 branch とかを指定する

git svn clone http://piece-orm.svn.sourceforge.net/svnroot/piece-orm -T trunk -b branches -t tags

これで branch とか tags の情報が git branch -r で見える。ただしローカルのブランチではない。(後述にて補足)

% git branch -r
1.0
branch-1.0
trunk

なぜか svn mv して消えたはずのブランチまで見えちゃってる。

ちなみに git branch しても、ローカルでは master しかないことになってる。

% git branch
* master

なおリモート先のツリーが更新 (ブランチが増えたとか) された場合、fetch して更新する。最後の引数の svn は fetch 対象として指定している名称で、.git/config にこの子の事が初期値として登録されている。変更したり増やしたりも出来る。

git svn fetch svn

ローカルブランチを作る

前述のとおり、clone 時に trunk やら branch やらを指定したものの、clone が終わった直後のローカルには master しかないことになっている。ここで git branch とかをやると、「移動したけど、これはローカルのブランチじゃあねえよ」とか言われる。

注意を言われると同時にローカルブランチの作り方を教えてくれるので、その通りにやる。

git checkout -b branch-1.0 branch-1.0

-b 以後の値のうち、前半はローカルブランチ名、後半はリモートのブランチ名。これで、ローカルブランチに branch-1.0 ができるので、git checkout branch-1.0 とかやればよい。

masterブランチをtrunkと等価にする

一見、svn の trunk が git の masterブランチとして作成されているように見せかけて、実際はそうではないケースがある。そうではないというのは、git svn dcommit する対象のリポジトリ URL が、trunk になっていないという状態のこと。恐らく、最後の変更 (ヘッドリビジョン) の対象となった箇所が master として作成されており、場合によっては branch や tags になっている場合がある。

対象ブランチのリポジトリURLがどうなっているかは、git svn info でみれる。この例では、11/14 時点の Piece_Right の info。URL が branches/1.0 になっている。もちろんこのままでは、dcommit する対象は branches/1.0 になってしまう。

% git svn info

Path: .
URL: https://piece-right.svn.sourceforge.net/svnroot/piece-right/branches/1.0
Repository Root: https://piece-right.svn.sourceforge.net/svnroot/piece-right
Repository UUID: 2263376b-7820-3741-b83e-21f0075cfe57
Revision: 475
Node Kind: directory
Schedule: normal
Last Changed Author: iteman
Last Changed Rev: 475
Last Changed Date: 2008-07-28 19:48:51 +0900 (月, 28 7月 2008)

ので、思い切って現在作成されている master ブランチを一度消去して、もう一度 trunk を指定して master ブランチを作ってしまう。

git branche -d master
git checkout -b master trunk

これで、master といえば trunk のことを指すようになる。

master と trunk は別!という風にしたいのであれば、master ブランチはそのままにしておいて trunk ブランチを別途作るのも。master = trunk とは言い切れないけども、少なくとも git においてはそのリポジトリのリビジョンヘッドのことじゃあないはず、なので trunk 化してしまっていいのではないかなと。