git svnのブランチの扱いについて
自分はバージョン管理システムとしてgitを利用してます。
プロジェクトで採用しているバージョン管理システムがSubversionの場合でもgit-svnで連携して生活してます。
今関わっているプロジェクトのsubversion上の構成がgit-svnにとって扱いづらいものが採用されていて、それの対処方法についてまとめておきます。
前提のプロジェクト構成
現在関わっているプロジェクトのバージョン管理システムでは以下のようなブランチ構成になっています。
branches/A/subA1 branches/A/subA2 branches/A/subA3 branches/B/subB1 branches/B/subB2 branches/B/subB3 branches/C/subC1/subsubC1-2 branches/C/subC1/subsubC1-2 branches/C/subC2/subsubC2-1 branches/C/subC2/subsubC2-2
ある機能Bの開発を進めているブランチがあって、その中に更に細かい機能向けのブランチが切ってあるような状況です。また、機能によって深さなども違っていたりします。
何が困るの?
svnをそのまま使って入れば特に困ったりしないのですが、git-svnでは上記構成の場合問題が発生します。具体的には、
- cloneする時
- ブランチが新規に追加された時
チェックアウト時
普通に
$ git svn clone -s http://example.com/git-url/
などとすると設定がうまくいかないです。git svn cloneは再帰的にブランチを探しに行きません。この場合ですと、git-url/branches/の直下にあるものをブランチとして認識してしまいます。つまりAとかBとかがブランチになってしまいます。subA1とかをブランチとして認識して欲しいのでこれでは困ります。
これに対する解決策は逐一branchの場所をちゃんと教えてあげれば大丈夫です。
$ git clone http://example.com/git-url/ -T trunk -b branches/A -b branches/B -b branchs/C/subC1/ -b branches/C/subC2/ -t tags/
このようにコマンドを発行する必要があります。ブランチが本当にある場所を指定して実行してあげれば大丈夫です。
ブランチが追加、削除された時
上記の設定をして安心して生活していても、こっそりブランチが追加されたりしたりします。
branches/D/subD/
とかが追加されたりするわけです。
この場合は以下の手順でgitに追加で認識させることができます
- .git/configに新しくできたブランチの場所を追加する
branches = branches/D/subD/*:refs/remotes/D/* # この行を追加
- 以下のコマンドを発行してブランチをチェックアウトさせる
$ rm .git/svn/.metadata packed-refs $ git svn fetch
これで、gitが新しいbranchを認識するようになるはずです。
それでは、皆さん良いgitライフを。