Git Logを使ってワークレポートを作成する方法

稀にクライアントから先週の活動報告のレポート提出を求められることがあります。ディベロッパーにとってこれほど退屈な作業はない。なので、レポート作成を楽にするために、ワークレポートをGit Logの情報を使って生成することにしました。

git log --author=Marco # Change with your name

アウトプットを取得するのにはこのような感じで:

 commit ad5140bca518c676cd4a6e9b268f66d3ff89f992
Author: Marco Vito Moscaritolo <marco@agavee.com>
Date: Fri Aug 23 12:50:41 2013 +0200

refs
#101: Lorem Ipsum commit message

commit
5d3d687cbdea09e334267312451065a4416ea5b1
Merge: 76c97d3 b7850f9
Author: Marco Vito Moscaritolo <marco@agavee.com>
Date: Fri Aug 23 12:39:35 2013 +0200

Merge branch 'master' of git.agavee.com:your-project/your-branch

commit
7e6e36eb78f3b07bcb12c0fa3c1e240e6634eccf
Author: Marco Vito Moscaritolo <marco@agavee.com>
Date: Fri Aug 23 10:35:41 2013 +0200

Lorem Ipsum commit message

commit f86221395bee652e08ab8d25c18445c27bb5b723
Author: Marco Vito Moscaritolo <marco@agavee.com>
Date: Fri Aug 23 10:35:23 2013 +0200

refs
#101: Lorem Ipsum commit message

commit
31dc49c6a8da7eda699aff7814baa0af555618d8
Author: Marco Vito Moscaritolo <marco@agavee.com>
Date: Thu Aug 22 09:26:40 2013 +0200

refs
#100: Lorem Ipsum commit message

次に過去1週間のみのログを出します。(又は先月など)Since と Untilオプションを使うことができます:

git log --author=Marco --since='1 sunday ago' --until='now'

アウトプットの形は似ていますが、日曜日などのみ指定することもできます。タイムフレームを下記のように設定します:

git log --author=Marco --since='2 sunday ago' --until='1 sunday ago'

また、好みに応じてタイムフレームは変更できます。
しかし、この形式の場合非常に読みにくいため、コンパクトで見やすいレポートにするためにFormatOptionを使います。これは、ログに情報を表示するためのフォーマットを定義する文字列を使用します。サンプルフォーマットとして:

%Cred%h%Creset %s %Cgreen(%ci) %Cblue<%an>%Creset

Comit hash (%h) は赤字の(%cred), Commit Message (%s)は普通の色の(%Creser), Commit Timeは(%Cgree)で緑いろにし(%Cgreen)、Author Name(%an)は青(%blue)で(%Cblue)にします。他のエレメント設定はこちらを参考にしてください。

この設定後:

ad5140b refs #101: Lorem Ipsum commit message (2013-08-23 12:50:41 2013 +0200) <Marco Vito Moscaritolo>
5d3d687 Merge branch 'master' of git.agavee.com:your-project/your-branch (2013-08-23 12:39:35 2013 +0200) <Marco Vito Moscaritolo>
7e6e36e Lorem Ipsum commit message (2013-08-23 10:35:41 2013 +0200) <Marco Vito Moscaritolo>
f862213 refs
#101: Lorem Ipsum commit message (2013-08-23 10:35:23 2013 +0200) <Marco Vito Moscaritolo>
31dc49c refs #100: Lorem Ipsum commit message (2013-08-22 09:26:40 2013 +0200) <Marco Vito Moscaritolo>

また、更新日とコミットメッセージのみ表示させる場合は:

%Cgreen%ci%Creset %s%Creset

この設定での表示はこのようになります:

git log --author=Marco --since='2 sunday ago' --until='1 sunday ago' --format='%Cgreen%ci%Creset %s%Creset'

2013-08-23 12:50:41 2013 +0200 refs #101: Lorem Ipsum commit message
2003-08-23 12:39:35 2013 +0200 Merge branch 'master' of git.agavee.com:your-project/your-branch
2013-08-23 10:35:41 2013 +0200 Lorem Ipsum commit message
2013-08-23 10:35:23 2013 +0200 refs #101: Lorem Ipsum commit message
2013-08-22 09:26:40 2013 +0200 refs #100: Lorem Ipsum commit message

この段階で基礎的なレポートフォーマットはできました。クライアントがなにをマージしたのか知りたい場合は、Messagesを削除し、no-mergesフラグを利用します。

git log --author=Marco --since='2 sunday ago' --until='1 sunday ago' --format='%Cgreen%ci%Creset %s%Creset' --no-merges

2013-08-23 12:50:41 2013 +0200 refs #101: Lorem Ipsum commit message
2013-08-23 10:35:41 2013 +0200 Lorem Ipsum commit message
2013-08-23 10:35:23 2013 +0200 refs #101: Lorem Ipsum commit message
2013-08-22 09:26:40 2013 +0200 refs #100: Lorem Ipsum commit message

これで、アクティビティに関するレポートは完成です。

最後に、この設定をGit Commandに保存する方法です。レポート生成のために、同じようなプロセスを繰り返す必要がなくなります。この設定をするには、.git/config fileの設定に下記ラインを追加します:

[alias]
report
= "log --author=Marco --since='2 sunday ago' --until='1 sunday ago' --format='%Cgreen%ci%Creset %s%Creset' --no-merges"

そして、下記コマンドでレポートを生成できるようになります:

git report

さらに、異なるドキュメントのレポートを生成することもできます。

report-csv = "log --author=Marco --since='2 sunday ago' --until='1 sunday ago' --format='"%ci""