应使用 git log --numstat 配合 awk 统计代码量,避免 git log -p 或 --shortstat 导致漏 merge、丢文件粒度或总量虚高;统计单次提交用 git show --stat ,merge 提交需加 -m 参数;排除 merge 干扰必须加 --no-merges;路径排除推荐 git 内置的 :(exclude) 语法而非 grep -v;windows 用户须用 git bash;真正难点在于 merge 处理、路径粒度和 shell 兼容性。

直接用 git log --numstat 配合 awk,别碰 git log -p 或 --shortstat 单独统计,否则要么漏 merge、要么丢文件粒度、要么总量虚高 2–5 倍。
统计单次提交的增删行(含文件级明细)
用 git show --stat <commit-id></commit-id> 最快最直观,它默认输出每个文件的新增/删除行数,格式清晰,适合人工快速核对。
常见错误是误用 git show --shortstat <commit-id></commit-id> ——它只返回汇总,比如 "3 files changed, 12 insertions(+), 4 deletions(-)",没了文件名,没法定位改了哪块。
对 merge 提交,默认不显示差异,必须加 -m 参数:git show -m --stat <merge-commit></merge-commit>,否则统计为 0。
统计某人某段时间的总代码量(排除 merge 干扰)
关键在 --no-merges:merge 提交会把父提交的变更重复计入,导致总量严重失真。
正确命令示例(统计 xiaoming 从 2024-01-01 到 2025-06-12 的净变化):
GitHub 仓库备份技能 - 将 OpenClaw 工作空间自动或手动备份至 GitHub 私有仓库。支持自动定时备份和手动交互式配置,引导完成 Token 配置、仓库创建、首次备份及定时任务设置。用途:(1) 首次设置 (2) 日常备份。
git log --author="xiaoming" --since="2024-01-01" --until="2025-06-12" --no-merges --pretty=tformat: --numstat | awk '{add += $1; subs += $2} END {printf "新增:%s, 删除:%s, 净增:%s\n", add, subs, add-subs}'
-
--numstat输出固定三列:insertions\tdeletions\tfilename,awk可靠解析 -
$1和$2为空时(如重命名、权限变更),awk自动当 0 处理,不影响总数 - Windows 用户必须用 Git Bash 运行,CMD/PowerShell 原生命令不支持
awk
排除构建产物和测试代码(避免统计污染)
用 Git 的路径限制语法比外部 grep -v 更准,不会误杀带注释的源码行。
推荐写法(跳过 build、dist、node_modules、test、static):
git log --author="xiaoming" --since="2024-01-01" --no-merges --pretty=tformat: --numstat -- . ":(exclude)build" ":(exclude)dist" ":(exclude)node_modules" ":(exclude)test" ":(exclude)static"
-
-- .是显式指定工作区根目录,防止路径匹配失效 -
:(exclude)xxx是 Git 内置路径排除,不依赖文件后缀或内容,稳定可靠 - 别用
grep -v "build\|dist",它会扫描所有输出行,可能误删含 “build” 的合法文件路径
统计所有人贡献并排序(终端友好格式)
用 git shortlog -sn 拿作者列表和提交次数,再嵌套 git log --numstat 算行数,最后用 printf 对齐:
printf "%-15s %8s %10s %10s %10s\n" "提交者" "提交次数" "新增行数" "删除行数" "净增行数"
git shortlog -sn | while read count author; do
git log --author="$author" --pretty=tformat: --numstat | awk -vcnt="$count" '
NF==3 { add += $1; subs += $2 }
END { printf "%-15s %8d %10d %10d %10d\n", "'"$author"'", cnt, add, subs, add-subs }
'
done
注意点:
-
git shortlog -sn按提交次数倒序,核心贡献者自动排前 -
NF==3过滤掉空行和非numstat行(如 commit message),避免awk报错 - 作者名含空格时,
read count author会截断;更健壮的做法是先用git log --format='%aN'去重,再逐个查
真正难的不是命令拼写,而是 merge 提交的干扰、路径排除的粒度、以及不同 shell 环境下管道链的兼容性——这些地方一错,统计结果就不可信。










