Ruby 開発者のための git 講座 - ChangeLog 編

不定期連載の git 講座ですが、今日は Ruby を開発する人のための tips っぽいです。

git-merge-changelog

Ruby で git を使ってローカルで開発していると、ChangeLog が毎回衝突して面倒です。ChangeLog の 衝突なんて冒頭でしか起きないのだから、それ専用の merge driver を書けばいいだけの話なのですが、書くのも面倒なので探すとすでに git-merge-changelog というものがあるようです。というわけで、入れてみたら便利だったのでここに紹介します。

FreeBSD の人は

devel/git-merge-changelog に入りました。

依存関係

DEPENDENCIES に依存関係は書いてあるのですが、一つずつ調べるのも面倒でしょうし、この日記の読者はすでに CRuby のビルド環境は整えているでしょうからその差分だけ言うと、automake です。なお、NetBSD の sh では後述の gnulib-tool が動かないので、shebang 行を /bin/ksh に書き換える必要があります。

手順

だいたい以下のような感じです。

% git clone git://git.sv.gnu.org/gnulib.git
% cd gnulib
% ./gnulib-tool --create-testdir --dir=/tmp/testdir123 git-merge-changelog
% cd /tmp/testdir123
% ./configure
% make
% sudo make install
% cat >> ~/.gitconfig
[merge "merge-changelog"]
name = GNU-style ChangeLog merge driver
driver = /usr/local/bin/git-merge-changelog %O %A %B
% cat >> ~/work/ruby/.git/info/attributes
ChangeLog merge=merge-changelog

なお、最後の gitattributes の設定は、「~/ ではなくて対象の git repository に設定ファイルを置かないと動かない」ようなので注意。

git commit for Ruby

ChangeLog が衝突しなくなったので、ガンガン変更点を書き残せるようになりました。ついでに、コミットメッセージも ChangeLog から書き出すようにしてしまいましょう。以下の注意点は、git add -u を実行している点。ポイントはコミットメッセージの冒頭末尾の空行は無視されるってことでしょうか。

git add -u && git diff --cached ChangeLog|ruby -e'puts$<.read[/^\+\w.*\n((?:^\+[ \t]?.*\n)+)/,1].to_s.gsub(/\+\t?/,"")'|git commit -F-