首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用Git精准统计作者提交次数和代码行数

用Git精准统计作者提交次数和代码行数

作者头像
SmileNicky
发布2025-12-17 17:59:04
发布2025-12-17 17:59:04
270
举报
文章被收录于专栏:Nicky's blogNicky's blog

用Git精准统计作者提交次数和代码行数

在团队开发中,清晰的代码贡献统计是项目管理和团队协作的重要参考。你是否还在为Git提交记录的零散数据发愁?是否因终端输出的杂乱格式而难以快速分析?本文将带你用几行命令实现提交次数+代码行数的精准统计,并通过printf格式化让结果整齐到“强迫症治愈”,新手也能直接复制使用。

一、为什么要做贡献统计?

在日常开发中,代码贡献统计的价值远超“看谁写得多”:

  • 项目管理:快速掌握迭代节奏(谁在高频提交?哪些模块变更最频繁?);
  • 协作优化:识别代码耦合风险(某成员提交过于集中可能意味着模块依赖过重);
  • 知识沉淀:明确核心贡献者,便于技术传承和权责划分;
  • 效率复盘:结合代码行数和提交次数,客观评估开发效率(避免“一次提交改一行”的无效迭代)。

二、核心脚本:一行命令搞定统计+对齐

以下脚本是本文的“核心武器”,只需复制到终端执行,就能输出左对齐的作者名右对齐的数字列,适配所有终端环境:

代码语言:javascript
复制
# 统计“提交次数+代码行数”,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

三、脚本拆解:每一行都有意义

为了让你知其然更知其所以然,我们逐行解析脚本逻辑:

1. printf格式化表头
代码语言:javascript
复制
printf "%-15s %8s %10s %10s %10s\n" "提交者" "提交次数" "新增行数" "删除行数" "总计行数"
  • %-15s-表示左对齐15s表示占15个字符宽度(适配作者姓名,避免截断);
  • %8s/%10s810表示字符宽度,s表示字符串类型(表头用字符串,数据行用数字);
  • 效果:表头各列严格对齐,为后续数据输出打好格式基础。
2. git shortlog -sn:获取作者与提交次数
代码语言:javascript
复制
git shortlog -sn
  • s(–summary):只输出“提交次数 + 作者名”,隐藏具体提交信息;
  • n(–numbered):按提交次数从多到少排序,让核心贡献者一目了然;
  • 输出示例(未格式化前):
代码语言:javascript
复制
  120  张三
   85  李四
   30  王五
3. while read count author:循环处理每个作者

git shortlog的输出按行读取,把“提交次数”赋值给count,“作者名”赋值给author,为后续统计做准备。

4. git log --author="$author" --pretty=tformat: --numstat:筛选作者的代码变更
代码语言:javascript
复制
git log --author="$author" --pretty=tformat: --numstat
  • --author="$author":只筛选当前作者的提交;
  • --pretty=tformat::清空提交的元信息(如commit hash、时间),只保留代码行数变化
  • --numstat:输出每行变更的“新增行数 删除行数 文件路径”,示例:
代码语言:javascript
复制
10  2  src/index.js
5   0  src/utils/format.js
5. awk:累加并计算总行数
代码语言:javascript
复制
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; }
'
  • v auth="
  • add += 1/subs += 2:累加所有提交的“新增行数(1)”和“删除行数(2)”;
  • add - subs:计算总计行数(净增行数);
  • 最终printf:按“左对齐作者名+右对齐数字列”的格式输出,与表头完美衔接。

四、执行效果:数据清晰到“一眼扫全”

运行脚本后,你会得到如下格式的输出(以示例数据为例):

代码语言:javascript
复制
提交者           提交次数    新增行数    删除行数    总计行数
张三              120       6500       2100       4400
李四               85       4200       1500       2700
王五               30        800        300        500
  • 作者名左对齐,即使有英文名/长昵称也不会截断;
  • 数字列右对齐,“提交次数”“行数”的量级差异一目了然;
  • 总计行数(新增-删除)直接反映代码净增量,避免“删得多写得也多”的误导。

五、场景化优化:让统计更贴合实际需求

上述脚本是通用方案,结合实际场景可进一步优化:

场景1:只统计特定分支(如main)

如果需要排除开发分支、测试分支的干扰,只需在git shortloggit log后添加分支名(如main):

代码语言:javascript
复制
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
场景2:排除非代码文件(如文档、配置)

若团队仓库中有大量README.mdpackage.json等非代码文件,可通过路径过滤排除它们:

代码语言:javascript
复制
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)。
场景3:统计最近N天的贡献

如果只需关注近期(如30天内)的迭代情况,可在git log中添加时间过滤:

代码语言:javascript
复制
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

六、常见问题与解决方案

问题1:统计结果出现“未知作者”或“重复作者”

原因:团队成员Git配置不一致(如user.name/user.email填写不规范),或历史提交中存在匿名提交。

解决:

  1. 统一Git配置:要求团队成员执行以下命令配置身份(替换为真实信息):
代码语言:javascript
复制
git config --global user.name "你的姓名"
git config --global user.email "你的邮箱"
  1. 修正历史提交:若需追溯历史,可使用git filter-branch批量修改作者信息(需谨慎操作,避免影响远程仓库):
代码语言:javascript
复制
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
问题2:统计速度慢(仓库历史悠久)

原因:仓库提交次数过多(数万次以上),遍历全量历史耗时较长。

优化:

  • 结合“场景3”的时间过滤,只统计近期提交;
  • 将统计结果输出到文件,避免重复执行:
代码语言:javascript
复制
bash 统计脚本.sh > 贡献统计_2025Q1.txt

七、总结

通过git shortloggit log --numstatawk的组合,再加上printf的精准格式化,我们实现了“提交次数+代码行数”的一站式统计,且输出格式对所有终端友好。

这些脚本不仅能帮你快速掌握团队贡献,更能在项目复盘、协作优化中提供数据支撑。记住:工具是手段,通过数据发现问题、推动改进才是最终目的——合理运用统计结果,让团队协作更高效、代码质量更可控。

现在就把脚本复制到你的终端,看看团队的贡献数据吧!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用Git精准统计作者提交次数和代码行数
    • 一、为什么要做贡献统计?
    • 二、核心脚本:一行命令搞定统计+对齐
    • 三、脚本拆解:每一行都有意义
      • 1. printf格式化表头
      • 2. git shortlog -sn:获取作者与提交次数
      • 3. while read count author:循环处理每个作者
      • 4. git log --author="$author" --pretty=tformat: --numstat:筛选作者的代码变更
      • 5. awk:累加并计算总行数
    • 四、执行效果:数据清晰到“一眼扫全”
    • 五、场景化优化:让统计更贴合实际需求
      • 场景1:只统计特定分支(如main)
      • 场景2:排除非代码文件(如文档、配置)
      • 场景3:统计最近N天的贡献
    • 六、常见问题与解决方案
      • 问题1:统计结果出现“未知作者”或“重复作者”
      • 问题2:统计速度慢(仓库历史悠久)
    • 七、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档