1 指定用户名版
git log --author="_Your_Name_Here_" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'
这句话可以输出当前项目内指定项目名的用户的代码量统计, 结果如下:
added lines: 30400 removed lines: 21317 total lines: 9083
2 使用ls -file实现不指定用户统计行数版
git ls-files -z | xargs -0n1 git blame -w | ruby -n -e '$_ =~ /^.*\((.*?)\s[\d]{4}/; puts $1.strip' | sort -f | uniq -c | sort -n
这段代码比较有意思,它扫描了当前分支的每个文件,然后用 Git 的 blame 功能输出每个人的代码行数,最后用系统命令 sort 和 uniq 实现计数。
结果如下:
8 aaa
9 bbb
145 ccc
146 ddd
261 eee
3 扫描Log统计增删行数版
git log --shortstat --pretty="%cE" | sed 's/\(.*\)@.*/\1/' | grep -v "^$" | awk 'BEGIN { line=""; } !/^ / { if (line=="" || !match(line, $0)) {line = $0 "," line }} /^ / { print line " # " $0; line=""}' | sort | sed -E 's/# //;s/ files? changed,//;s/([0-9]+) ([0-9]+ deletion)/\1 0 insertions\(+\), \2/;s/\(\+\)$/\(\+\), 0 deletions\(-\)/;s/insertions?\(\+\), //;s/ deletions?\(-\)//' | awk 'BEGIN {name=""; files=0; insertions=0; deletions=0;} {if ($1 != name && name != "") { print name ": " files " files changed, " insertions " insertions(+), " deletions " deletions(-), " insertions-deletions " net"; files=0; insertions=0; deletions=0; name=$1; } name=$1; files+=$2; insertions+=$3; deletions+=$4} END {print name ": " files " files changed, " insertions " insertions(+), " deletions " deletions(-), " insertions-deletions " net";}'
这段比较复杂,我也没有认真解读,直接贴结果吧:
aaa,: 353 files changed, 9359 insertions(+), 3844 deletions(-), 5515 net
aaa,bbb,: 4 files changed, 144 insertions(+), 2 deletions(-), 142 net
ccc,: 114 files changed, 2301 insertions(+), 481 deletions(-), 1820 net
ddd,: 27 files changed, 1856 insertions(+), 757 deletions(-), 1099 net
eee,: 1726 files changed, 32841 insertions(+), 22719 deletions(-), 10122 net
eee,fff,: 13 files changed, 209 insertions(+), 211 deletions(-), -2 net
ggg,: 53 files changed, 1153 insertions(+), 1170 deletions(-), -17 net
fff,: 2445 files changed, 69875 insertions(+), 62148 deletions(-), 7727 net
fff,eee,: 30 files changed, 394 insertions(+), 472 deletions(-), -78 net
bbb,: 37 files changed, 781 insertions(+), 216 deletions(-), 565 net
hhh,: 4 files changed, 34 insertions(+), 4 deletions(-), 30 net
比较奇怪的是会列出两个人同时修改,可能是 merge 操作,没有深究.
4 扫描Log单独统计每个人的增删行数加强版
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
直接上输出:
aaa added lines: 34, removed lines: 4, total lines: 30
bbb added lines: 2301, removed lines: 481, total lines: 1820
ccc added lines: 1856, removed lines: 757, total lines: 1099
ddd added lines: 30400, removed lines: 21317, total lines: 9083
eee added lines: 1153, removed lines: 1170, total lines: -17
fff added lines: 1153, removed lines: 1170, total lines: -17
ggg added lines: 72886, removed lines: 64233, total lines: 8653
hhh added lines: 814, removed lines: 216, total lines: 598
iii added lines: 9503, removed lines: 3846, total lines: 5657
5 第三方小工具
使用这个工具可以直接输出非常漂亮的统计表格:
https://github.com/oleander/git-fame-rb