unoh.github.com

git-svn駆け込み寺

2010-05-22 03:44:55 +0000

こんにちは。murahashiです。
gitやgit-svnを使うにあたり、試したことや引っかかったことについて、yukiのエントリ ウノウラボ Unoh Labs: subversionリポジトリでもgitが使えるgit-svn のつづきを書いてみました。

git_svn_bad_200x280.jpgQ. ブランチ名を長くしてしまったので手打ちするのが大変です



git_svn_good_200x289.jpgA. bashでgitコマンドを補完します

gitのコマンド補完は git-completion.bash が便利です。
fedoraにyumでgitを入れた場合には下記場所にあります。
/usr/share/doc/git-VERSION/cntrib/completion/


自分の見える場所にgit-completion.bashがなければ、インストール済みのgitと同じversionのgitのソースをダウンロードします。
cntrib/completion/

に入っているので.bashrcのなかで読み込みましょう。補完が効くようになります。




git_svn_bad_50x70.jpgQ. 除外設定にしていたファイルがコミットされてしまいます



git_svn_good_50x72.jpgA. .git/info/exclude に書きましょう
$ git svn show-ignore >> .git/info/exclude


svn:ignoreと.gitignoreで混乱しないようにしましょう。





git_svn_bad_50x70.jpgQ. 中身が空のディレクトリが作られません



git_svn_good_50x72.jpgA. 自分で作りましょう

gitだけを使ったプロジェクトで空ディレクトリ作りたいときは空の.gitignore ファイルをいれておくのが定番です。
git-svn利用時に.gitignoreをコミットしていいかについては話し合いましょう。





git_svn_bad_50x70.jpgQ. svn externals を自動で取得してくれません



git_svn_good_50x72.jpgA. git-svn-clone-externals を使いましょう

How do I keep an svn:external up to date using git-svn? - Stack Overflow
andrep's git-svn-clone-externals at master - GitHub
ほかにもいろいろ手段はあって、一長一短の解説が書いてあるページもありました(url失念)。私はシンプルなのがいいと、git-svn-clone-externalsを利用しています。事前に別の場所で試してみるとよいでしょう。





git_svn_bad_50x70.jpgQ. git-svn-clone-externals 動かないのですが



git_svn_good_50x72.jpgA. show-externals、みえていますか

$ git svn show-externals


これが見えていないとfetchできません。
私の場合、見えていたリポジトリと見えてないリポジトリがありました。
リポジトリ間の設定を目diffして見えていない側に追加したところ、見えていなかった側からshow-externalsが見えるようになりました。
ここはちょっとよくわからないです。svn側がtrunk決め打ちの人しか下記追加は当てはまらないと思います。
$ git config --add svn-remote.svn.url svn+ssh://example.com/path/to/repository/trunk
$ git config --add svn-remote.svn.fetch :refs/remotes/git-svn


同じプロジェクトで同じ開発マシンを使っているのにshow-externalsが見えない人もいました。原因を探す余裕がない場合は別の手段をとるしかないでしょう。git submodule使うとか、git cloneして放り込んでignoreとか、動く手段を探してください。





git_svn_bad_50x70.jpgQ. svnリポジトリにコミットしたいです



git_svn_good_50x72.jpgA. mergeしてdcommitするのが堅いです

ローカルのgitリポジトリにコミットしたあと、

$ git branch //今のブランチを確認
 * 000_TOPIC_BRANCH
   master
$ git diff //差分ないことを確認
$ git checkout master
$ git branch //今のブランチを確認
   000_TOPIC_BRANCH
 * master
$ git svn rebase //svn update相当
$ git merge --no-ff --no-commit 000_TOPIC_BRANCH
$ git add .
$ git commit -v
$ git svn dcommit


できました!
no-ffなのはよくわかっていなくておまじない状態です。
no-commitは自分でdiffとつき合わせてコミットログを書きたいからです。
ローカルのgit側では頻繁にcommitかつ適当にコメントを書いているので、リモートのsvn側にpushする際にきちんとコミットコメントをかくように調整しています。
ただこの運用でsvn側のコミット粒度が荒くなってしまったので、注意がいるかもしれません。





git_svn_bad_50x70.jpgQ. svnのあれがgitで



git_svn_good_50x72.jpgA. あるていどは割り切りましょう

結局のところ何でもかんでもすべてをgitやgit-svnでやろうとするのは無理があるので、こみいったところはsvnコマンドたたくほうがよいと思います。ほかにもtortoiseSVNとtortoiseGitの違いとかwindowsでgitとかいろいろあると思います。





濱野さんの入門Gitの「chapter16 間違いからの回復」を繰り返し参照することになるので手元にあると便利ですね。

以上デース