
在团队开发中,清晰的代码贡献统计是项目管理和团队协作的重要参考。你是否还在为Git提交记录的零散数据发愁?是否因终端输出的杂乱格式而难以快速分析?本文将带你用几行命令实现提交次数+代码行数的精准统计,并通过printf格式化让结果整齐到“强迫症治愈”,新手也能直接复制使用。
在日常开发中,代码贡献统计的价值远超“看谁写得多”:
以下脚本是本文的“核心武器”,只需复制到终端执行,就能输出左对齐的作者名和右对齐的数字列,适配所有终端环境:
# 统计“提交次数+代码行数”,printf精准对齐
# %-15s:左对齐,占15字符宽度;%8d:右对齐,占8字符宽度(数字更易读)
printf "%-15s %8s %10s %10s %10s\n" "提交者" "提交次数" "新增行数" "删除行数" "总计行数"
git shortlog -sn | while read count author; do
# 统计行数并按格式输出
git log --author="$author" --pretty=tformat: --numstat | awk -v auth="$author" -v cnt="$count" '
{ add += $1; subs += $2; }
END { printf "%-15s %8d %10d %10d %10d\n", auth, cnt, add, subs, add - subs; }
'
done为了让你知其然更知其所以然,我们逐行解析脚本逻辑:
printf格式化表头printf "%-15s %8s %10s %10s %10s\n" "提交者" "提交次数" "新增行数" "删除行数" "总计行数"%-15s:-表示左对齐,15s表示占15个字符宽度(适配作者姓名,避免截断);%8s/%10s:8和10表示字符宽度,s表示字符串类型(表头用字符串,数据行用数字);git shortlog -sn:获取作者与提交次数git shortlog -sns(–summary):只输出“提交次数 + 作者名”,隐藏具体提交信息;n(–numbered):按提交次数从多到少排序,让核心贡献者一目了然; 120 张三
85 李四
30 王五while read count author:循环处理每个作者将git shortlog的输出按行读取,把“提交次数”赋值给count,“作者名”赋值给author,为后续统计做准备。
git log --author="$author" --pretty=tformat: --numstat:筛选作者的代码变更git log --author="$author" --pretty=tformat: --numstat--author="$author":只筛选当前作者的提交;--pretty=tformat::清空提交的元信息(如commit hash、时间),只保留代码行数变化;--numstat:输出每行变更的“新增行数 删除行数 文件路径”,示例:10 2 src/index.js
5 0 src/utils/format.jsawk:累加并计算总行数awk -v auth="$author" -v cnt="$count" '
{ add += $1; subs += $2; }
END { printf "%-15s %8d %10d %10d %10d\n", auth, cnt, add, subs, add - subs; }
'add - subs:计算总计行数(净增行数);printf:按“左对齐作者名+右对齐数字列”的格式输出,与表头完美衔接。运行脚本后,你会得到如下格式的输出(以示例数据为例):
提交者 提交次数 新增行数 删除行数 总计行数
张三 120 6500 2100 4400
李四 85 4200 1500 2700
王五 30 800 300 500上述脚本是通用方案,结合实际场景可进一步优化:
如果需要排除开发分支、测试分支的干扰,只需在git shortlog和git log后添加分支名(如main):
printf "%-15s %8s %10s %10s %10s\n" "提交者" "提交次数" "新增行数" "删除行数" "总计行数"
git shortlog -sn main | while read count author; do
git log main --author="$author" --pretty=tformat: --numstat | awk -v auth="$author" -v cnt="$count" '
{ add += $1; subs += $2; }
END { printf "%-15s %8d %10d %10d %10d\n", auth, cnt, add, subs, add - subs; }
'
done若团队仓库中有大量README.md、package.json等非代码文件,可通过路径过滤排除它们:
printf "%-15s %8s %10s %10s %10s\n" "提交者" "提交次数" "新增行数" "删除行数" "总计行数"
git shortlog -sn | while read count author; do
# 排除 .md/.json/.yml 文件,只统计代码变更
git log --author="$author" --pretty=tformat: --numstat -- . ":(exclude)*.md" ":(exclude)*.json" ":(exclude)*.yml" | awk -v auth="$author" -v cnt="$count" '
{ add += $1; subs += $2; }
END { printf "%-15s %8d %10d %10d %10d\n", auth, cnt, add, subs, add - subs; }
'
done-- .:表示只统计当前目录下的文件;:(exclude)*.md:排除所有.md后缀的文件,可根据需求添加更多规则(如.txt、.csv)。如果只需关注近期(如30天内)的迭代情况,可在git log中添加时间过滤:
printf "%-15s %8s %10s %10s %10s\n" "提交者" "提交次数" "新增行数" "删除行数" "总计行数"
git shortlog -sn | while read count author; do
git log --author="$author" --since="30 days ago" --pretty=tformat: --numstat | awk -v auth="$author" -v cnt="$count" '
{ add += $1; subs += $2; }
END { printf "%-15s %8d %10d %10d %10d\n", auth, cnt, add, subs, add - subs; }
'
done原因:团队成员Git配置不一致(如user.name/user.email填写不规范),或历史提交中存在匿名提交。
解决:
git config --global user.name "你的姓名"
git config --global user.email "你的邮箱"git filter-branch批量修改作者信息(需谨慎操作,避免影响远程仓库):git filter-branch --env-filter '
OLD_EMAIL="旧邮箱@example.com"
CORRECT_NAME="正确姓名"
CORRECT_EMAIL="正确邮箱@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]; then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]; then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags原因:仓库提交次数过多(数万次以上),遍历全量历史耗时较长。
优化:
bash 统计脚本.sh > 贡献统计_2025Q1.txt通过git shortlog、git log --numstat和awk的组合,再加上printf的精准格式化,我们实现了“提交次数+代码行数”的一站式统计,且输出格式对所有终端友好。
这些脚本不仅能帮你快速掌握团队贡献,更能在项目复盘、协作优化中提供数据支撑。记住:工具是手段,通过数据发现问题、推动改进才是最终目的——合理运用统计结果,让团队协作更高效、代码质量更可控。
现在就把脚本复制到你的终端,看看团队的贡献数据吧!