Commands to get commit statistics for a Git repository from the command line -
using git log
, git shortlog
and friends.
$ git log --format='%aN' | sort -u
Example output:
Jane Bar
John Foo
Steve Baz
$ git shortlog -sn
Example output:
136 Jane Bar
41 John Foo
17 Steve Baz
$ git shortlog -sn --no-merges
Example output:
121 Jane Bar
36 John Foo
14 Steve Baz
Even though the --no-merges
option is not documented for git shortlog
, it works exactly as defined for git log
.
$ git log --author="Vorname Nachname" --pretty=tformat: --numstat | awk '{inserted+=$1; deleted+=$2; delta+=$1-$2; ratio=deleted/inserted} END {printf "Commit stats:\n- Lines added (total).... %s\n- Lines deleted (total).. %s\n- Total lines (delta).... %s\n- Add./Del. ratio (1:n).. 1 : %s\n", inserted, deleted, delta, ratio }' -
Example output:
Commit stats:
- Lines added (total).... 4625
- Lines deleted (total).. 836
- Total lines (delta).... 3789
- Add./Del. ratio (1:n).. 1 : 0.180757
$ git log --shortstat --author="Vorname Nachname" | grep -E "fil(e|es) changed" | awk '{files+=$1; inserted+=$4; deleted+=$6; delta+=$4-$6; ratio=deleted/inserted} END {printf "Commit stats:\n- Files changed (total).. %s\n- Lines added (total).... %s\n- Lines deleted (total).. %s\n- Total lines (delta).... %s\n- Add./Del. ratio (1:n).. 1 : %s\n", files, inserted, deleted, delta, ratio }' -
Example output:
Commit stats:
- Files changed (total).. 439
- Lines added (total).... 4625
- Lines deleted (total).. 836
- Total lines (delta).... 3789
- Add./Del. ratio (1:n).. 1 : 0.180757
Note: Both commands above also count merge commits. But to ignore them, one can simply use the --no-merges
option again:
$ git log --author="Vorname Nachname" --pretty=tformat: --numstat --since="1 Jan, 2015" | awk ...
# or
$ git log --shortstat --author="Vorname Nachname" --since="1 Jan, 2015" | grep -E ...
You can filter the output of the above commands, for example, by adding --until
or --since
or --before
:
$ git log --author="Vorname Nachname" --pretty=tformat: --numstat --since="1 Jan, 2015" | awk ...
# or
$ git log --shortstat --author="Vorname Nachname" --since="1 Jan, 2015" | grep -E ...
I wanted to suggest an additional option through a tool called
mergestat
to also display some of these stats (full disclosure, I'm the creator/maintainer), via a SQL interface.For example, a SQL query like the following will show commit stats by author, similar to the
List file change stats by author
section above.It can be amended to filter out merge commits or to limit the date range via
WHERE
clause conditions:There are some other tables available as well, and since the input is just SQL, it's fairly flexible to tailor a query to meet specifically what you're looking for (break out by file name, filter out certain authors, etc)