git 修改已提交的某一次的邮箱和用户信息

小猿大圣
  • 1.3k

git 公司用户名和自己的不同造成的

在提交代码的时候,默认使用了全局的git 用户配置,用户名 xiaoli 然后push 到github了

之后我配置了一下项目的git用户,使用了xiaowang又push了一次代码

如果我现在想改写第一次的git commit 的用户邮箱该怎么做那?

我使用

git rebase -i HEAD~2

但是只出现了最后一次的提交信息。

评论
阅读 16.9k
4 个回答

自问自答

我现在是写了一个脚本,如果某个项目用错了 git 用户信息,我就把脚本放到项目里,运行一下脚本。

脚本内容

changeGitInfo.sh

#!/bin/sh

git filter-branch --env-filter '
an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"
if [ "$GIT_COMMITTER_EMAIL" = "要修改的@邮箱地址.com" ]
then
    cn="想要改成的用户名"
    cm="想要改成的邮箱"
fi
if [ "$GIT_AUTHOR_EMAIL" = "要修改的@邮箱地址.com" ]
then
    an="想要改成的用户名"
    am="想要改成的邮箱"
fi
    export GIT_AUTHOR_NAME="$an"
    export GIT_AUTHOR_EMAIL="$am"
    export GIT_COMMITTER_NAME="$cn"
    export GIT_COMMITTER_EMAIL="$cm"
'

使用方式

sh ./changeGitInfo.sh

我的操作步骤略麻烦,所以备图以做注解:

首先,通过gitk打开历史纪录,如下图:

图片描述

本例中,我试图修改第三个提交more tests for later change cases对应的用户名/邮箱信息。

第一步,拷贝第四个提交update readmeSHA1 ID值,如上图选中部分4535579(不必全部,印象中前八位足矣)

第二步,回到命令行,开始执行rebase -i操作,如下:

git rebase -i 4535579

这个时候,git会自动调用配置好的编辑器打开一个界面,如下:

图片描述

第三步,修改第一行数据(就是我们预期要修改的那条commit)的pickedit,如下:

图片描述

保存退出,可以看到如下结果:

图片描述

帅,这时候我们就可以通过git commit --amend来畅快的修改用户信息了,操作如下:

git commit --amend --author="LiLei <lilei@qq.com>" --no-edit

继续完成rebase

git rebase --continue

再次打开gitk,就可以享受你的结果了:

图片描述

最后,通过git push --force将篡改历史纪录后的结果同步到服务器

注意,强制更新会有一定风险,就是这个时候如果有其他人也在向服务器提交代码,那会被你的强制更新给覆盖掉。

刚遇到这个问题,有个更好的办法 这个

主要代码就是

git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD

HEAD可以替换成 HEAD~3...HEAD 这样就可以指定哪几次提交替换。

相关问题: 这里

试试这个,加入判断, @雾秋 说的那样会将前N条提交记录全替换掉,不一定适合所有场景,当然所说的指定替换哪几次提交到是好挺好的。

git filter-branch --force --env-filter '
  #如果Git用户名等于老的Git用户名 wangshuyin
  if [ "$GIT_COMMITTER_NAME" = "<Old Name>" || "$GIT_AUTHOR_EMAIL" = "<Old Email>" ];
  then
    #替换提交的用户名为新的用户名,替换提交的邮箱为正确的邮箱
    GIT_COMMITTER_NAME="<New name>";
    GIT_COMMITTER_EMAIL="<New email>";
    
    #替换用户名为新的用户名,替换邮箱为正确的邮箱
    GIT_AUTHOR_NAME="<New name>";
    GIT_AUTHOR_EMAIL="<New email>";
  fi
' --tag-name-filter cat -- --all
撰写回答

登录后参与交流、获取后续更新提醒

宣传栏