怎么修改git log的作者信息,我的建议是已经推送到远端的代码提交日志不要动它们,即使是有问题的,也应该保留,git的意义才存在。
但如果是你的自己的项目,比如自己的github仓库,想要将自己的邮箱、自己的真名移除,用花名来替代,则可以用下面的方法。
前提
- 仓库允许强推
- 仓库是自己学习项目
- 会修改原始提交的commit id产生新的commit id
修改项目的作者信息
作者信息可以存在全局和项目两种方式。
-
全局
全局存在目录和操作系统有关
# Window存放在你的git安装目录下,例如 C:\ProgramData\Git\config\ C:\Program Files\Git\mingw64\etc\gitconfig # unix\linux\mac存放在etc目录下,例如 /etc/gitconfig如果是用户级别的,则存放在你当前用户目录下的
.gitconfig中~/.gitconfig -
项目
项目级别的存在在项目的根目录下
# .git/config
它的格式如下
[user]
name = Your Name
email = your.email@example.com
[core]
editor = code --wait
[alias]
co = checkout
br = branch
ci = commit
st = status
获取配置
# 获取全局配置
git config --global user.email
git config --global user.name
# 获取项目级别配置,在项目中执行
git config --local user.email
git config --local user.name
修改方法
修改方法可以直接通过UTF-8的文本格式去编辑,也可以通过下面的命令去修改
# 设置全局配置
git config --global user.email "邮箱地址"
git config --global user.name "作者名称"
# 设置项目级别配置,在项目中执行
git config --local user.email "邮箱地址"
git config --local user.name "作者名称"
# 或者使用=赋值
git config --local user.email="邮箱地址"
当配置完成后,在进行commit、rebase、merge等产生新的commit的时候,会优先使用项目的配置,项目如果没有配置作者信息则会从全局获取,全局也没有,则会给一个警告并组织提交,完成配置后才可以进行提交。
修改未push远端的commit的作者信息
使用rebase -i HEAD^2、git commit --amend --no-verify等命令来进行修改,修改后会使用作者信息进行commit,具体如何使用rebase、merge、commit的操作不在这里展开。
修改已push到远端的commit的作者信息
新建一个脚本文件reset_author.sh,并增加执行权限
chmod +x reset_author.sh
脚本内容如下,替换掉要修改的邮箱、要修改成的邮箱、要修改的作者名称、要修改成作者名称,执行脚本即可。
#!/bin/bash
git filter-repo --force \
--email-callback '
email_str = email.decode("utf-8")
if email_str == "要修改的邮箱":
return b"要修改成的邮箱"
return email
' \
--name-callback '
name_str = name.decode("utf-8")
if name_str == "要修改的作者名称":
return "要修改成作者名称".encode("utf-8")
return name
'
修改完成后,使用git fetch重新拉取一下远端,再使用git status查看下状态,发现本地重新生成了很多记录。
使用git push -f强推一下即可。
稍微修改一下,支持交互
#!/bin/bash
echo "留空将跳过对应信息的替换。"
read -p "请输入要替换的旧邮箱(如不替换,请留空): " old_email
read -p "请输入新的邮箱: " new_email
read -p "请输入要替换的旧用户名(如不替换,请留空): " old_name
read -p "请输入新的用户名: " new_name
args=(--force)
if [[ -n "$old_email" && -n "$new_email" ]]; then
args+=(
--email-callback "
email_str = email.decode('utf-8')
if email_str == '$old_email':
return b'$new_email'
return email
"
)
fi
if [[ -n "$old_name" && -n "$new_name" ]]; then
args+=(
--name-callback "
name_str = name.decode('utf-8')
if name_str == '$old_name':
return '$new_name'.encode('utf-8')
return name
"
)
fi
if [[ ${#args[@]} -eq 1 ]]; then
echo "未提供任何替换信息,已取消操作。"
exit 1
fi
git filter-repo "${args[@]}"
再次强调,已经push到远端的所有错误都应该保留,不应该进行修改。以上文档是用于自我学习,出了事不要把我供出来。