linux下git本地代码统计需用git log --numstat配合awk/grep,注意--all覆盖分支、--since用yyyy-mm-dd格式、排除二进制文件及构建产物,并明确定义统计范围。

Linux 下 Git 本地代码统计不需要额外安装工具,核心靠 git log + awk + grep 组合完成,但必须注意 --numstat 的输出格式和分支范围是否覆盖完整 —— 漏掉 --all 或误用 --since 时间格式,结果就直接少一半。
git log --numstat 输出格式与字段含义
--numstat 是统计增删行最可靠的 Git 原生命令,但它输出是「空格分隔、无表头」的三列文本,顺序固定为:新增行数 删除行数 文件路径。任何 awk 脚本都得严格按这个顺序取值,否则加减会错位。
-
$1是新增行数(正整数或-,遇到二进制文件时会出现) -
$2是删除行数(同上) -
$3及之后是文件路径,可能含空格,所以不能简单用$3提取 - 遇到二进制文件时,
git log --numstat会输出-\t-\tfilename,awk中需跳过:if ($1 == "-") next
统计某人某段时间的净增行数(最常用场景)
例如统计用户 zhangsan 在 2025 年 3 月 1 日至今的代码贡献:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
git log --author="zhangsan" --since="2025-03-01" --pretty=tformat: --numstat | awk 'NF==3 && $1 != "-" {add += $1; subs += $2} END {printf "added: %s, removed: %s, net: %s\n", add, subs, add-subs}'
-
NF==3过滤掉空行和 merge 提交产生的异常行 - 时间格式必须是
YYYY-MM-DD,midnight在部分 Git 版本中不兼容,建议统一用日期字符串 - 没加
--all默认只查当前分支,如果 zhangsan 的提交在feature/login分支上,而你当前在main,这条命令就查不到
统计所有分支下所有人的贡献排名
想看整个仓库谁改得最多,不能只跑一遍 git log,得先确保覆盖全部分支:
git log --all --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 10
-
--all是关键,漏掉它等于只统计当前分支的作者 - 注意
%aN取的是 author name,不是 committer name;如果有人用不同邮箱配置了多个 identity,会算作不同人 - 若要合并同一人不同昵称(如
zhangsan和Zhang San),得手动映射或用--author=多次匹配再累加
排除构建产物和配置文件(避免统计失真)
默认 git log --numstat 会把 package-lock.json、dist/、.env 全算进去,实际应过滤:
git log --all --author="lisi" --pretty=tformat: --numstat -- . ":(exclude)dist" ":(exclude)build" ":(exclude)node_modules" ":(exclude)package-lock.json"
-
-- .表示从工作区根开始限定路径范围 -
:(exclude)是 Git 的 pathspec 排除语法,只在 Git 2.13+ 支持,旧版本需改用grep -v - 排除项必须写在
--numstat后面,顺序错会导致过滤失效
真正难的不是写对一行命令,而是搞清你要统计的「代码」到底指什么:是所有被 Git 跟踪的文本文件?还是仅业务源码?是否包含测试?是否去重合并多次修改?这些边界一旦没对齐,数字再准也没意义。










