@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

ふたたび Gitのdiffを振り返る

続々 Gitのdiffを振り返る - @ledsun blogでコミット単位でのファイルの変更行数の遷移をふりかえりました。

コミット単位では列間が詰まりすぎてグラフが見にくいです。 特に、Gitのコミット数を振り返る - @ledsun blog で見たように、2020年9月以降コミット粒度を小さくしています。

f:id:ledsun:20201220211139p:plain
2020年の月別コミット数

このため列間がますます詰まり、グラフから情報が読み取りにくくなっています。 そこで、ファイルの変更行数を、再び、日、週、月、年の単位で集計します。

次のRubyスクリプトを使います。

require "Time"
require "Date"

duration = $*.shift.to_s.to_sym

Commit = Struct.new(:at, :insertions, :deletions)

# カウントしたくないファイルを除外
EXCLUDE = "':(exclude)package-lock.json' ':(exclude)*.min.js' ':(exclude)*.css' ':(exclude)dist/*' ':(exclude)dev/vender' ':(exclude)src/lib/modules' ':(exclude)*.md'"

`git log --after='2019-05-22 00:00' --format=format:'---%n%ai' --shortstat #{EXCLUDE}`
  .split("---\n")[1..] # 1行目は空なので捨てる
  .map { _1.split("\n") }
  .filter { |time, stats| !stats.empty? } # 除外しているファイルがあるのでstatsが出ないことがある
  .map { |time, stats| Commit.new(Time.parse(time), stats.split(",")[1].to_i, stats.split(",")[2].to_i) } # " 1 file changed, 10 insertions(+), 9 deletions(-)" をパース
  .filter { _1.insertions < 1000 } # 1000行以上の変更はツールによるので除外する
  .sort_by { _1.at.to_i }
  .reduce({}) do |result, item|
  case duration
  when :day
    date = Date.parse item.at.to_s # 日
  when :week
    date = Date.parse(item.at.to_s) - item.at.wday # 週
  when :month
    date = Date.parse item.at.strftime("%Y-%m-01") # 月
  when :year
    date = Date.parse item.at.strftime("%Y-01-01") # 年 は期間が違い過ぎるので、比較には向かない
  else
    date = item.at
  end
  if result.key? date
    result[date].insertions += item.insertions
    result[date].deletions += item.deletions
  else
    result[date] = Commit.new(date, item.insertions, item.deletions)
  end

  result
end
  .each_value do
  puts "#{_1.at.strftime("%F_%T")} #{_1.insertions} #{_1.deletions}"
end

引数で、dayweekmonthyearを受け取り、それぞれの単位で集計します。 出力データ形式続々 Gitのdiffを振り返る - @ledsun blogと一緒です。

gnuplot> set xdata time
gnuplot> set timefmt "%Y-%m-%d_%H:%M:%S"
gnuplot> plot 'all_log_day.dat' using 1:2 w i title 'insertions' lw 2, 'all_log_day.dat' using 1:3 w i title 'deletions' lw 2

f:id:ledsun:20201230165055p:plain
日毎のファイルの変更行数

続 Gitのdiffを振り返る - @ledsun blogのグラフと比べると大分ちがいます。 変更行数の変動が少なく、現実の作業効率を反映していそうです。

f:id:ledsun:20201227231409p:plain
異常値を除いた一日毎のファイルの変更行数

どうやら、本当に一日に2000〜2500行の変更をしているようです。

今年は 「論理的思考の放棄」をパクる - @ledsun blog に書いたように 1日1000行のリファクタリング を目指してプログラミングスタイルを工夫していました。半年を経て、どうやら達成したようです。 現時点では、一回しか達成していないので、再現性がないかもしれません。 来年は、これがフロックでないことを確認したいと思います。

「1日1万行とか、絶対無理じゃん」という思いもありましたが、あと4倍なら、俄然現実味が帯びて参りました。