❌❌❌不要这么干:如何修改git log的作者信息

128 阅读3分钟

怎么修改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^2git 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到远端的所有错误都应该保留,不应该进行修改。以上文档是用于自我学习,出了事不要把我供出来。