今所属してるチームに入ってから1年が経った。開発してるサービスのコードベースの中でも、「このへんはわりと土地勘がついてきたな」という場所と「ここはまだ全然わからん」という場所が混在している感じになってきた。
自分がまだ触ったことないのはどのあたりかを知りたかったので、今までの自分のコミット数をファイルごとに見れるようにしてみようと思った。調べてもそういうツールは見つからなかったので、作った。
ファイルの履歴
ファイルのコミット履歴を出力する:
git log ファイル名
リネーム前の履歴も欲しい:
git log --follow ファイル名
しかし --follow
つけると、ファイルをコピーしてからちょっと編集したやつも同一ファイルと見做されてしまうので、それをなるべく避ける*1:
git log --follow --find-renames=100% ファイル名
そのコミット履歴をユーザーごとに集計して出力する:
git log --follow --find-renames=100% ファイル名 | git shortlog --summary
知らないオプションがどんどん出てきてすごかった。
.mailmap
上記の方法で集計してみたら、人が複数に分裂してカウントされていることがわかった。異なるユーザ名やメールアドレスを使ってコミットされたものは別々に集計されるからだった。
一人の人が会社のメールアドレスと @gmail.com
と @users.noreply.github.com
でコミットしていたり、名前も戸籍ネームとはてな ID と GitHub のアカウント名が混在していたりして、めちゃくちゃだった。
.mailmap
ファイルを作ることで正規化してもらえるとのことだったので、
git shortlog -se | sed -r 's/[[:space:]]+[[:digit:]]+\t//' > .mailmap
で初期状態の .mailmap
を作ってあとは目視で同一人物をマージしていくという方法で頑張った。
こうやってやっとファイルごとのコミット数の集計ができた。React を使って可視化してみるとこういう感じ。
当初は他の人にも使ってもらえる形で作れればいいなと思っていたけど、
.mailmap
書くの大変すぎる- 集計にものすごい時間がかかる(全ての現存するファイルに対して素朴に
git shortlog
しているので⋯)
という理由で実用的でないので、一人で楽しむためだけに使おうと思う。