随记

git修改已提交记录中的用户信息

最近手上设备比较多,提交混乱了。对于自己一个日常用的github仓库,用了公司的电脑修改少许代码后提交了。本来拉取时已经将git的地址(git remote -v查看)修改为私人token的地址了(比如git remote set-url origin https://bob:token@github.com/bob/repo.git),但是公司电脑上设置过global全局的git配置,于是看到提交记录里最新的几个变成了自己公司的用户名和邮箱,打算改回私人的名字和邮箱,毕竟这个不是公司用的。

切换到该仓库的目录,先看看global和local有不有信息,发现global有,local没有

git config --global -l # -e是编辑; global有信息
git config --local -l  # local未设置信息

用git log查看了最近4次都是用的公司的用户名和邮箱,还好不是公司的和私人的记录混合着,好处理一些。

马上设置一下local的信息

git config --local user.name "bob"
git config --local user.email "xx@yy.com"
git config --local -l  # 再检查一次

如果只是最后一次执行错了,就执行这个

git commit --amend --reset-author --no-edit

因为这里有4次连续的最近提交,就这样执行

git rebase -i HEAD~4

在弹出的文本编辑器中,将要修改的那4行开头的 pick 改为 edit,:wq保存并退出。

此时git会分别停留在这4次提交的每一次提交上,分别执行命令,直到不再提示。

git commit --amend --reset-author --no-edit
git rebase --continue

做了4次后没有提示了,此时再运行命令

git push origin main --force

然后再次git log就能看到最近4次的提交的用户名和邮箱都修改到了。

不过对于提交记录里不同的用户名混杂在历史中,这样就不行了,这样的情况下可以试试Git官方推荐的git-filter-repo工具,或者使用以下传统的filter-branch 脚本(未运行过,谨慎修改):

git filter-branch --env-filter '
OLD_EMAIL="公司邮箱@company.com"
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 log看看,没问题后就强制提交到github同步

git push origin --force --all

文章评论 (0)