Git log のフォーマットを変更する

業務で作業時間をまとめないといけない仕事が降ってきたのだけれど、思い返してみればコミットメッセージタイトルに時間を書いていたなと思い出して、Git のコミットログの表示の変更方法を調べたのでメモ。

通常一覧で簡易的に表示したい場合は以下のように「--oneline」オプションをつける。

git log --oneline

これだと最終的に日付とかが表示されないので、表にするとき不便。最終的にはエクセルにまとめて提出しないといけないらしいので、 CSV ファイル形式としてアウトプット。

#!/bin/sh

# ========== SETTINGS ==========
OUTFILE=project.csv
YEAR=2016
REPOPATH=/path/to
REPOS=( \
  "one.example.com" \
  "two.example.com" \
  "three.example.com" \
)

for repo in ${REPOS[@]}
do
  echo "REPO: [${repo}]"

  git --git-dir=${REPOPATH}/${repo}/.git log \
   --after="${YEAR}-01-01 00:00:00" \
   --before="${YEAR}-12-31 23:59:59" \
   --no-merges \
   --date-order \
   --reverse \
   --date=short \
   --pretty=format:"\"%ad\",\"%h\",\"%an\",\"%s\",\"${repo}\"" \
   >> ./${OUTFILE}.csv

done

# output csv
sort ${OUTFILE} > ${OUTFILE}
  • ソフトウェア資産計上って事なので年単位指定(「--after」と「--before」)
  • 本来はマージした log だけ表示するべきだけど、逆にマージしたもの以外は作業時間を書いていたのでマージ以外を表示(「--no-merges」逆にマージしたものだけ表示したい場合は「--merges」)
  • 日付で降順に並び替え(「--date-order」と「--reverse」)
  • 足りない項目をフォーマット指定で追加(「--pretty=format」を追加)
  • 複数のリポジトリを日付毎にマージした(これは sort コマンドを使ってる)
  • 本来リポジトリとかコマンドライン引数とかにするんだろうけど、時間かけたくなかったのでループ

参考