コードベースのどのへんを触ったことがあるかを一覧する

今所属してるチームに入ってから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 を使って可視化してみるとこういう感じ。

f:id:YaaMaa:20210417085333p:plain
これは一人プロジェクトなので、当然全てのファイルに触ったことがある

当初は他の人にも使ってもらえる形で作れればいいなと思っていたけど、

  • .mailmap 書くの大変すぎる
  • 集計にものすごい時間がかかる(全ての現存するファイルに対して素朴に git shortlog しているので⋯)

という理由で実用的でないので、一人で楽しむためだけに使おうと思う。

github.com

*1:できればリネームは追うけどコピーは追わない、という設定にしたかったけど、これを読む限り難しそうだった。