跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / Bash大前端

Git 高效统计:作者提交次数与代码行数分析

通过 Git 命令组合实现作者提交次数与代码行数的自动化统计。内容涵盖基础命令解析、格式化输出技巧、分支过滤及时间范围筛选等场景优化,并针对常见配置问题给出解决方案,帮助团队客观评估开发效率与协作质量。

极客零度发布于 2026/3/22更新于 2026/9/859 浏览

为什么要做贡献统计?

在团队开发中,清晰的代码贡献数据是项目管理和协作优化的重要参考。除了直观地看谁写得多,这些数据还能帮助快速掌握迭代节奏、识别模块依赖风险、明确核心贡献者以及客观评估开发效率。

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

下面这个脚本是实战中的常用方案,只需复制到终端执行,就能输出左对齐的作者名和右对齐的数字列,适配所有终端环境:

# 打印表头
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 的格式化控制,%-15s 表示左对齐占 15 字符宽度,适合存放作者姓名;%8d 或 %10d 则是数字右对齐,方便阅读量级差异。

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

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

1. 获取作者与提交次数

使用 git shortlog -sn 命令:

  • s(–summary):只输出'提交次数 + 作者名',隐藏具体提交信息。
  • n(–numbered):按提交次数从多到少排序,让核心贡献者一目了然。

2. 筛选作者的代码变更

通过 git log --author="$author" --pretty=tformat: --numstat 获取当前作者的代码变更详情:

  • --author="$author":只筛选当前作者的提交。
  • --pretty=tformat::清空提交的元信息(如 commit hash、时间),只保留代码行数变化。
  • --numstat:输出每行变更的'新增行数 删除行数 文件路径'。

3. 累加并计算总行数

利用 awk 进行数据处理:

  • -v auth="$author" / -v cnt="$count":将 Shell 变量传递给 awk。
  • add += $1 / subs += $2:累加所有提交的'新增行数'和'删除行数'。
  • add - subs:计算净增行数(总计行数)。
  • 最终 printf:按预设格式输出,与表头完美衔接。
  • 场景化优化:让统计更贴合实际需求

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

    只统计特定分支

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

    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 等非代码文件,可通过路径过滤排除它们:

    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
    

    统计最近 N 天的贡献

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

    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 配置:要求团队成员执行以下命令配置身份。
      git config --global user.name "你的姓名"
      git config --global user.email "你的邮箱"
      
    2. 修正历史提交:若需追溯历史,可使用 git filter-branch 批量修改作者信息(需谨慎操作,避免影响远程仓库)。

    问题 2:统计速度慢(仓库历史悠久)

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

    优化:

    • 结合时间过滤,只统计近期提交。
    • 将统计结果输出到文件,避免重复执行:
      bash 统计脚本.sh > 贡献统计_2025Q1.txt
      

    总结

    通过 git shortlog、git log --numstat 和 awk 的组合,再加上 printf 的精准格式化,我们实现了'提交次数 + 代码行数'的一站式统计,且输出格式对所有终端友好。这些脚本不仅能帮你快速掌握团队贡献,更能在项目复盘、协作优化中提供数据支撑。合理运用统计结果,让团队协作更高效、代码质量更可控。

    目录

    1. 为什么要做贡献统计?
    2. 核心脚本:一行命令搞定统计 + 对齐
    3. 打印表头
    4. 循环处理每个作者
    5. 脚本拆解:每一行都有意义
    6. 1. 获取作者与提交次数
    7. 2. 筛选作者的代码变更
    8. 3. 累加并计算总行数
    9. 场景化优化:让统计更贴合实际需求
    10. 只统计特定分支
    11. 排除非代码文件
    12. 统计最近 N 天的贡献
    13. 常见问题与解决方案
    14. 问题 1:统计结果出现“未知作者”或“重复作者”
    15. 问题 2:统计速度慢(仓库历史悠久)
    16. 总结

    更多推荐文章

    查看全部
    • Raphael AI:全球首个无限制免费 AI 图片生成器
    • 免费 Trae 编辑器体验:i18n 任务排队千名及 AI 编程现状分析
    • Mac mini 打造家庭数据中心:集成 OpenClaw 与私有云导航服务
    • libwebkit2gtk-4.1-0 安装指南:Linux 桌面 WebView 开发配置
    • RISC-V 智能家居中控开发实战:硬件、固件与通信全链路
    • 基于 LLaMA-Factory 微调与 vLLM 部署的大语言模型实战
    • Python 环境安装与配置完整指南
    • SpringAI 大模型应用开发新手入门指南
    • Neo4j 在 Windows 上的安装与配置教程
    • Minecraft 开源注入式客户端 LiquidBounce 使用指南
    • 大模型算法实习面试复盘:RAG、LoRA、强化学习与 Agent 架构解析
    • System Verilog 教程:从基础到高级验证
    • C++ STL 容器 set 与 map 使用详解
    • Q-Learning 强化学习无人机三维路径规划原理与 MATLAB 实现
    • DeepFace 结合 OpenCV 实现实时情绪分析
    • 程序员副业接单避坑指南与职业建议
    • AI 产品经理核心技能体系与职业成长路径
    • Stable Diffusion 大模型与 LoRA 入门使用技巧及实例分享
    • RAG 大模型入门与实践
    • C++ 模板进阶:非类型参数、特化与分离编译

    相关免费在线工具

    • Base64 字符串编码/解码

      将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

    • Base64 文件转换器

      将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

    • Markdown转HTML

      将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

    • HTML转Markdown

      将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

    • JSON 压缩

      通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

    • JSON美化和格式化

      将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online