読者です 読者をやめる 読者になる 読者になる

作業ノート

様々なまとめ、雑感など

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して、開発を続けるようにしている。