git-svnを使ったプログラム管理
仕事では、プロジェクトごとにSubversionを使ってソースを管理しているところが多い。
しかし、trunkだけでブランチやタグを管理していないプロジェクトがあったり、
ひとまずプログラムの変更、修正を試したいことがあっても、リポジトリがsvnだとそれが難しく、また面倒でもある。
そこで最近は、git-svnを使い、ローカルでブランチを切って開発している。
以下は、作業でよく使用するgit svnコマンドについてまとめた。
チェックアウト
$ git svn clone http://www.example.com/src/foo/
trunk, branches, tags といった、svnで一般的な管理を行っていないときは、このようにソースのあるパスを直接指定する。
svnで一般的な管理を行っているときは、sオプションをつける。
$ git svn clone -s http://www.example.com/src/foo/
こうすると、gitのmasterにtrunkが割り当てられ、リモートブランチに、trunk, branches, tags直下のディレクトリが設定される。
trunk, branches, tagsのパスを個別に指定することもできる。
ローカルブランチの作成
$ git co -b foo
これは、通常のgitでの開発と同じ。
masterを最新にする
$ git co master $ git svn rebase
リモートブランチをfetchし、masterにrebaseをかけて、HEADをリモートブランチと同じにする。
ローカルブランチからのマージ
$ git co master
$ git svn rebase
$ git merge --no-ff foo
masterに変更した後、masterを最新にして、ローカルブランチの変更点をマージする。
no-ffオプションは、マージしたブランチを見かけ上一つにしないようにするため。
あと、リモートブランチをマージするとき、このオプションをつけておかないとリモートブランチの向き先が意としないところに変わるらしい。
詳細は、以下を参照。
git-svnでリモートブランチをmergeするときは–no-ffをつけるべし - Webtech Walker
Subversionのリポジトリへの反映
$ git svn dcommit -e
Subversionのリポジトリとmasterとの差分をコミットする。
eオプションは、コミットコメントを編集するためのもの。
ちなみにマージ直後で反映する際にeオプションをつけないと、マージしたときのコメントがそのまま反映される。
Merge from {ブランチ名} といったコメントがそのまま反映されてしまい、他の人からはコメントの意味がわからないので注意。
git svn rebaseでコンフリクトが起きたとき
コンフリクトが起きた場合は、通常のgitでのrebaseと同様に対処する。
$ git rebase --continue $ git rebase --skip $ git rebase --abort
なお、git svn rebaseではないことに注意。
svn:ignoreの反映
$ git svn show-ignore >> .git/info/exclude
svn:ignoreが設定されているファイル、ディレクトリを、gitでも無視するようにする。
trunkで大きな変更がされたとき
$ git co master $ git svn rebase $ git co foo $ git rebase master
たとえば、ローカルブランチでの開発が長引いてしまい、その間にtrunkの変更が重なっていったとき。
まず、ローカルブランチ上でrebaseしてチェックを行い、その後masterへのマージ、チェック後、trunkへ反映している。
trunkの変更が大きく、しかも引き続きローカルブランチでの開発が必要な場合でも、適当なタイミングでローカルブランチをrebaseして、開発を続けるようにしている。