抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

发现在某厂实习的同学有一个码力统计平台,可以看到写了多少代码。由此联想到,我们每次执行 Commit 的时候都可以看到控制台输出的文件行数增加减少的提示。因此此信息是被 Git 统计了的,那么当然可以在本地获取到,只不过获取的是单个存储库的内容。

我更好奇为啥 Gitlab 等 Git 端没有集成这个功能,是觉得意义不大吗

首先,我们来用 git log 获取当前存储库所有贡献者,并用 sort -u 去重。此处获得的名字是 gitconfig 设置的名字。

1
authors=$(git log --format='%aN' | sort -u)

接下来,我们来遍历这些名字,并根据作者名字获取numstat

其中,--pretty:tformat:是一个空的自定义格式,表示我们将会忽略所有提交信息,这样我们的输出结果里只有numstat了。

最后,使用awk来统计数量即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 一行一行读取名字
echo "$authors" | while read name; do
# 输出一个定宽名字
do printf '%-20s' "[$name]"

git log --author="$name" --pretty=tformat: --numstat | awk '
{
add += $1 # 累加添加的行数
subs += $2 # 累加删除的行数
loc += $1 - $2 # 计算总的代码行数变化
}
END {
# 输出统计结果
printf "[Add] %-6d [Removed] %-6d [Total] %-6d\n", add, subs, loc
}'
done

最终,我们可以把代码写成一行并用管道连接。可以写成一个alias,如果你想的话。

1
git log --format='%aN' | sort -u | while read name; do printf '%-20s' "[$name]"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "[Add] %-6d [Removed] %-6d [Total] %-6d\n", add, subs, loc }'; done

这样就可以看到你写了多少行代码了。哇,好有用的功能啊。

1
[Nivek]             [Add] 114514 [Removed] 1919   [Total] 112595 

评论