如何批量修改 git 历史提交记录中的 username 和 email。

一. 作用

修改某个仓库历史 commit 的用户 name 和 email 信息。
将历史提交记录中的指定 name/email 修改为新的 name/email。

二. 步骤

  • 确认本地全局邮箱/用户名
  • 查看仓库的历史提交信息
  • 批量修改历史记录中的信息
  • 将修改结果推送到远程

1.确认本地全局邮箱/用户名

使用下面两个命令查看 git 在本地的全局邮箱和用户名。

git config user.name
git config user.email

如果需要修改 git 在本地的全局邮箱和用户名,执行下面的命令。

git config --global user.name "输入你的用户名"
git config --global user.email "输入你的邮箱"

现在我们已经设置好了本地 git 的user.nameuser.email信息。

2.查看仓库的历史提交信息

git clone 你要修改的仓库,进入该仓库目录,打开 git bash 界面,执行 git log 命令查看历史提交信息(重点关注 Author)。

3.批量修改历史记录中的信息

打开一个文本编辑器,粘贴下面代码。 然后把 OLD_EMAIL,CORRECT_NAME,CORRECT_EMAIL 改成自己的新旧邮箱用户名。

git filter-branch -f --env-filter '
OLD_EMAIL="原来的邮箱"
CORRECT_NAME="现在的名字"
CORRECT_EMAIL="现在的邮箱"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

回到 git bash 界面,复制粘贴上面的代码并按回车执行。 如果 commit 记录比较多的话执行的时间会比较长。

等待执行完成后,再查看 git log 可以看到已经修改成功。

特殊情况:

如果上面的批量修改命令执行失败的话,执行一下这段命令:

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD

4.将修改结果推送到远程

git push 将修改后的结果推送到远程后,git log 去看一下之前的提交记录中,name 和 email 信息都更新了。

三. Linux/Mac下可以写个脚本

在项目根目录下创建git-email.sh,写入下面这段代码:

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="原来的邮箱"
CORRECT_NAME="现在的名字"
CORRECT_EMAIL="现在的邮箱"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

然后需要赋予执行权限:

sudo chomd +x git-email.sh

执行一下这个 .sh 文件:

sudo ./git-email.sh
64位Linux系统 API数据分析 Android应用市场 Android开发 Android电视盒子 Android签名证书生成 Apk上架应用商店 Aplayer报错解决方案 Aplayer播放器 App Store CDN DSDT Django Excel FM发射器 Git GitHub GitHub page Github Git用户名邮箱修改 Google Analytics Google Play Google/Baidu search Google插件 H5与CSS3 HBuilder HBuilder打包APP HBuilder打包ipa Hexo Hexo-neat插件 Homebrew Cask JavaScript学习笔记 Linux常见命令 MySQL数据库 Python Python爬虫 SEO优化 Videoscribe Vue Vue电商 Windows10 api接口搭建 console git clone 速度过慢 hexo hexo-admin插件 hexo-sakura主题 hexo-tag-aplayer插件 hexo主题 homebrew iOS iOS开发 js用法、范例 koolshare live2d看板动画 node.js npm 安装踩过的坑 oc引导 openwrt软路由系统 python qlv视频下载 robots.txt valine评论 win10 wx-server-sdk 个人主页 个人开发者 中国移动魔百盒 中文破解版 云函数 优化访问速度 全球加速 博客 又拍云 反编译 和风天气 国内CODing托管 图床 域名加速 学习笔记 宝塔 实践项目 小技巧 小程序开发 开源小游戏 微信公众号 微信小程序 微信小程序开发 微擎 必应每日一图 抖音小程序 教程 数据可视化 本地打包iOS包 机械革命 树莓派 树莓派4b 电池补丁 百度云cdn 百度地图api 百度搜索 百度收录 百度权重 百度统计 突发奇想 站点地图 笔记 腾讯广告 腾讯视频 自制小玩意儿 自媒体 视频搬运 访问者地图 谷歌Adsense 软路由 静态数据库 面试题 黑苹果

等待也是约会的一部分嘛