git log --author 统计漏提交是因为 author 字段非唯一标识,同一人可能有多个邮箱、大小写混用、昵称别名或合并提交未包含;需先用 git log --pretty="%an " | sort -u 建立映射表,并配合 --all、--no-merges 和 --use-mailmap 确保覆盖完整。

git log --author 统计时为什么总漏掉部分提交?
直接用 git log --author="name" 会漏掉合并提交、作者邮箱不一致、大小写混用或昵称/别名的情况。Git 的 author 字段不是唯一标识,同一人可能有多个邮箱(比如 dev@company.com 和 dev@gmail.com),或者 commit 里写的是 John Doe,但 git shortlog 默认只认全名匹配。
- 先用
git log --pretty="%aN " | sort -u查出所有实际出现过的 author 名+邮箱组合 - 建立映射表:把多个变体归到一个开发者名下,例如
{"john.doe@company.com": "John Doe", "j.doe@company.com": "John Doe"} - 避免用模糊匹配(如
--author="John"),它会误匹配 "Johnny" 或其他含 John 的名字
统计代码行数该用 --shortstat 还是 --numstat?
--shortstat 只给增删总行数(如 32 insertions(+), 5 deletions(-)),没法区分文件类型或排除生成文件;--numstat 输出每行 +additions -deletions filename,可精准过滤、累加,更适合自动化脚本。
- 用
git log --numstat --no-merges --author="..."获取原始变更数据 - 跳过二进制文件:检查
filename后缀(如.png,.pdf)或用file --mime-type判断是否 text - 排除构建产物:正则过滤
^build/|^dist/|^node_modules/|^__pycache__/
Python 脚本里怎么安全解析 git log --numstat 输出?
git log --numstat 输出格式不稳定:空行分隔、第一行可能是空、最后一行可能没换行。不能靠 splitlines() 直接切,必须按块解析。
- 逐行读取,遇到空行就结束当前 commit 块;每块开头两行是 author/date,后面才是
numstat行 - 对
numstat行用re.match(r"^(\d+|-)\s+(\d+|-)\s+(.*)$", line)提取增删行数和路径 - 注意
-表示二进制文件,跳过该行(不计入统计) - 用
pathlib.Path(filename).suffix.lower()判断是否为源码文件(如.py,.js,.java)
如何避免统计被 rebase 或 amend 搞乱?
如果团队常用 git rebase -i 或 git commit --amend,author 时间戳和 commit hash 都会变,但真正要统计的是“谁写了哪段代码”,不是“谁在哪天提交了什么”。更可靠的方式是结合 git blame,但它开销大、不适用于整个仓库。
- 默认仍用
git log,但加--all遍历所有分支(包括已删除但未 gc 的) - 加
--first-parent可跳过 merge commit 的次要父提交,防止重复统计(适合主干开发模式) - 若需精确到行级归属,用
git blame -w -M -C批量处理关键目录,但单次运行耗时可能超 10 分钟,慎用
真正难的不是写脚本,而是定义“谁写了多少”——是按 commit author 算,还是按 blame 结果算?前者快但不准,后者准但慢且依赖当前 HEAD 状态。多数团队选前者,但得提前统一邮箱规范。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











