git shortlog -e 仅在作者名后追加 ,不支持按邮箱去重、排序或聚合统计;真正按邮箱统计需用 git log --format="%ae" | sort | uniq -c | sort -nr。

git shortlog -e 的作用不是按邮箱统计,而是显示邮箱后缀
git shortlog -e 实际上只是在默认输出的作者名后面追加 <email></email>,它本身**不支持按邮箱去重、排序或聚合统计**。你看到的“按邮箱统计”效果,其实是靠后续管道处理实现的。直接运行 git shortlog -e 只会把每个提交作者展开成“姓名 ”,且同一邮箱若对应多个姓名(比如换过 Git 配置),会被当作不同条目——这反而导致重复计数。
真正按邮箱统计贡献量:用 git log + awk 或 sort/uniq
要准确统计每位开发者(以邮箱为唯一标识)的提交数、新增/删除行数,得绕过 shortlog,改用 git log 输出结构化字段:
-
git log --format="%ae %an" --numstat可提取邮箱、姓名和每文件增删行数,但需清洗 - 更稳的方式是分两步:先用
git log --format="%ae" --no-merges提取所有非合并提交的邮箱,再用sort | uniq -c | sort -nr统计频次 - 如果还要带姓名,用
git log --format="%ae %an" --no-merges | sort -u去重后手动关联,因为 Git 不保证同一邮箱始终对应同一%an
示例命令(仅统计邮箱提交次数):git log --no-merges --format="%ae" | sort | uniq -c | sort -nr
适用于以下场景:(1)用户提供 GitHub 仓库 URL 或本地仓库路径,并请求将其转换为其他格式;(2)用户请求导出 GitHub 仓库……
生成修订详情表:避免 --numstat 和 --shortstat 混用
--numstat 输出每文件的增删行,适合做代码量分析;--shortstat 只给汇总(如 “3 files changed, 12 insertions(+), 4 deletions(-)”)。两者不能同时生效——Git 会优先用 --numstat 并忽略 --shortstat。
- 要导出可读的修订表(含日期、邮箱、摘要、变更行数),推荐:
git log --no-merges --format="%ad %ae %s" --date=short --numstat - 注意
--numstat的输出是“空行分隔”的:每块第一行是提交信息格式化内容,之后是若干“+/- 行数 文件路径”行,最后空行。解析时得按空行切分,不能简单用awk '{print $1,$2}' - 如果只想看每个提交的总增删数(不细分文件),用
--shortstat更轻量,但无法反查具体哪些文件被改
容易被忽略的坑:邮箱大小写、空格、别名与 .mailmap
Git 默认把 Alice@example.com 和 alice@example.com 当作两个不同作者——这会导致统计虚高。解决方式只有两种:
- 强制统一:用
git config --global core.ignorecase true**无效**(Git 不靠 FS 大小写判断邮箱) - 正确做法是维护项目根目录下的
.mailmap文件,例如写入:Alice Smith <alice><alice></alice></alice>
这样git shortlog -e和git log --format="%ae"都会自动映射归一 - 另外,CI 环境中常见
github-actions[bot]这类 bot 邮箱,建议在统计前用grep -v "\[bot\]"过滤,否则会拉低真实开发者占比
没配 .mailmap 就跑统计,等于拿原始日志硬算——结果看着多,其实水分很大。










