手元バージョン管理を全部gitにしてからはや数ヶ月。最初はいろいろとまどったが、案外慣れてしまうものだ。
まず仕事方面。いろいろな都合から会社の中央レポジトリはSubversionなので、gitはgit-svnと共に使っている。最近の仕事はどっぷりLinuxで、gitでさくさくfeature branchを切りかえて作業ができるのは実によい。
仕事で相手をしているSubversionのレポジトリはtrunk/branches/tagsの標準的なスタイルなので、git svn clone
時には-sをつけて、リモートのsvnブランチもローカルのgitのブランチとしてcloneしている。
git svn clone -s (subversionのURL) hoge
このcloneはかなり遅いが、まあ、一度作ってしまえば、あとは適当に[cci_bash]git svn rebase[/cci_bash]してゆけば更新されるのでさほど困りはしないはず。
さて、そうやってcloneしたレポジトリの上で、何か機能を作りこむ必要があるときは、
git checkout -b hogehoge
と作業ブランチhogehogeを作って作業し、確認が終わったら
git checkout master
して、git svn rebase
して、おもむろに、
git merge --squash hogehoge
あるいは
git merge ーno-ff hogehoge
としてhogehogeブランチの作業内容をマージしてから最後に
git svn dcommit
して、またgit svn rebase
しつづける定常状態に戻る。dcommit直前まではsvnのことを忘れていられるのがよい。
自宅環境(Windows&FreeBSD)にはsvnはからまないので普通にgitを使っている。自宅サーバにbareレポジトリを作って、そこにssh経由でpush/pullすることで出先からの取得・更新も可能にしているが、運用練習も兼ねてbitbucketに移動したほうが幸せかもしれないと最近は考えている。
LinuxでもFreeBSDでもWindowsでも、シェルにbashかzshを使っている限りは補完が充実しているので、シェルで使うのが一番だ。ただ、作業はEmacs上で行うので、履歴や差分の確認はEmacs上のEggに頼ることも多い。慣れ親しんだEmacsのvc.elライクなキーバインドなので悩まずに済むのがよい。
さて、コマンドラインでgitを使っていてもコミットメッセージはEmacsを使いたいので、core.editorにはemacsclientを指定している。FreeBSDとLinux上のEmacsは(prefer-coding-system 'utf-8-unix)
にしているので何もせずに新規バッファを作ればutf-8になるが、Windows環境は諸処の事情でutf-8を最優先にしていないので何もしないとコミットメッセージが化ける。んで、下記のhookを入れている。
(add-hook 'server-visit-hook
(function (lambda ()
(if (string-match "COMMIT_EDITMSG" buffer-file-name)
(set-buffer-file-coding-system 'utf-8)))))
職場でもっとgitとgit svnの啓蒙活動をしたいところだなぁ。