首页/开发/Git 与协作速查/git mailmap 归并作者署名
Git 基础与命令88 条

git mailmap 归并作者署名

用 .mailmap 把同一人的多个姓名与邮箱映射到一个规范署名,影响 shortlog、log 等展示结果。

Git 与协作速查开发更新于 2026-10-13

mailmap 是什么

mailmap(仓库根 .mailmap 文件)把同一贡献者在历史里的多个姓名与邮箱归并成一个规范署名,用于展示与统计:shortlog 名单、log 的作者行、blame 标注都会按映射显示。它不修改任何历史提交,只影响怎么显示,因此可以随时增删、随仓库分发。

基本信息

文件位置仓库根 .mailmap;也可用 mailmap.file 或 mailmap.blob 指定
文件格式规范署名 规范邮箱 旧邮箱,多种写法
生效命令shortlog、log 默认界面、blame 与 aN/aE 占位符
例外an 与 ae 占位符永远显示原始署名;log 可用 --no-use-mailmap 关闭映射
权限要求普通用户;文件提交后对全队生效

典型使用场景

  • 换过邮箱的同事:历史提交两个邮箱并存,贡献名单重复计数
  • 同一人多个姓名:shortlog 输出多行,评优与统计要按人合并
  • 开源项目整理贡献者:发布前归并署名再生成名单
  • 机器人账号:把自动生成的邮箱归并到一个规范署名统一展示
  • blame 排查更顺:文件作者显示规范名而不是多个马甲

常用示例

常用示例
# 在仓库根创建 .mailmap,邮箱需与历史精确匹配
cat > .mailmap <<'EOF'
Zhang San <zhangsan@example.com> <zhangsan@old-mail.com>
Zhang San <zhangsan@example.com> Old Name <old@example.com>
EOF
git check-mailmap "Old Name <old@example.com>"  # 单条验证映射结果
git shortlog -sne HEAD                          # 确认名单已合并

四种书写形式

写法效果说明
新名 <旧邮箱>只替换姓名同邮箱的多份署名归一
<新邮箱> <旧邮箱>只替换邮箱姓名不动、按邮箱合并
新名 <新邮箱> <旧邮箱>按旧邮箱替换姓名与邮箱最常用的形态
新名 <新邮箱> 旧名 <旧邮箱>姓名与邮箱联合匹配替换同名多邮箱场景
实测行为(Git 2.54):log 默认界面、blame 与 shortlog 都会应用 mailmap;an 与 ae 占位符不应用,需要映射后的值用 aN 与 aE 大写形式。
托管平台的贡献图按平台侧账号计算,.mailmap 只影响本地命令输出;两边对不上时要在平台侧补邮箱绑定或账号设置。

易错点

  • 精确匹配才命中:邮箱大小写与拼写要完全一致,历史里大写小写混用是两条记录,漏配则归并不全
  • 平台贡献图不受影响:GitHub 与 GitLab 按账号统计,署名仍可能显示多个马甲,需要平台侧设置才有一致效果
  • 把 mailmap 当历史改写工具:它不改写提交内容,导出的 patch 与变更记录仍是原始署名,要改写历史得用 filter-repo
  • 忘记提交 .mailmap:只在本机生效,同事的 shortlog 仍然重复计数

数据来源与参考

  • Git 官方文档:git-shortlog(mailmap)
  • Git 官方文档:gitmailmap
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌