ファイル毎の総追加行数・総削除行数を出すGitのサブコマンド、git-freqをリリースしました

プロジェクトが一段落して「どの機能が一番大変だったのかな?バグが多かったのは?」という情報を知りたくなりました。ということで、ファイル毎の総追加行数・総削除行数を出すGitのサブコマンドを作りました。

https://github.com/fujimura/git-freq

http://hackage.haskell.org/package/git-freq

$ cabal install git-freq でインストールできます。Haskellの環境が必要なので、お持ちでなかったらHaskell Platformをインストールしてください。

結果はcsvでファイル名、追加行数、削除行数の順に出力されます。 Lens2587bb01だとこんな感じです。

$ git freq | head
src/Control/Lens.hs,5365,5263
src/Control/Lens/Fold.hs,5885,3471
src/Control/Lens/Internal.hs,4205,4123
src/Control/Lens/Type.hs,3493,2869
src/Control/Lens/TH.hs,3530,2066
src/Control/Lens/Setter.hs,3097,1846
src/Control/Lens/Internal/Zipper.hs,2432,2436
src/Control/Lens/Traversal.hs,2846,1628
src/Control/Exception/Lens.hs,2646,1697
src/Control/Lens/Plated.hs,2395,1715

本来は機能ごとに変更を計測したくて、GitHubのタグをAPI経由で取得して…と夢は広がったんですが道のりが遠そうなので、とりあえずファイル別に見れればよいかなと思い。

実装はgit log --numstatを合計してるだけです。 IOを型クラスで抽象化してテスタブルにする、ってのが出来たのが嬉しいです。

たぶんドキュメントとかサードパーティーのライブラリとか、測りたくないファイルが結果に出ちゃうと思うんですが、そういう場合はこんな感じで絞ればOK。Ruby on Railsa6c8cdeActiveRecord部分の様子です。

$ git ls-files activerecord |grep -v html |xargs git freq
activerecord/CHANGELOG.md,12854,12126
activerecord/lib/active_record/base.rb,10026,9703
activerecord/lib/active_record/associations.rb,9331,7615
activerecord/test/cases/migration_test.rb,5384,4486
activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb,4829,4085

CHANGELOGが一番更新が多い。しっかりしてますね。

問題点としてはファイルを移動すると変更量がリセットされてしまう点です。仕方ないか。あと歴史の長いリポジトリだとgit log --numstat自体が結構時間かかるので、遅いです。 次は日付毎に変更量を取れるようにしたいなって思ってます。

ファイルごとでも合計が取れると結構面白いですよ。あ〜ここが辛かったんだな、とか。プロジェクトが一段落したらgit freqして、振り返ってみてはどうでしょうか。