修复 Git 提交历史中的作者信息

尴尬的情况

相信很多开发者都遇到过这样的情况:刚接手一个新项目,兴致勃勃地开始 coding,提交了一堆代码后突然发现 - 糟糕,Git 的用户名和邮箱信息还是自己的私人邮箱!这些提交记录都跑到公司的代码仓库里去了。

问题描述

假设我们需要将以下Git提交信息:

user.name = private_name
user.email = [email protected]

修改为:

user.name = company_name
user.email = [email protected]

解决方案

我们可以使用Git的filter-branch命令来批量修改历史提交记录。以下是具体步骤:

1. 首先确认需要修改的提交记录

git log --author="private_name" --pretty=format:"%h %an %ae %s" | head -10

2. 创建修改脚本

创建一个名为 git-author-rewrite.sh 的脚本文件:

#!/bin/sh

git filter-branch --env-filter '
OLD_NAME="private_name"
OLD_EMAIL="[email protected]"
NEW_NAME="company_name"
NEW_EMAIL="[email protected]"

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

3. 执行修改

  1. 给脚本添加执行权限:chmod +x git-author-rewrite.sh
  2. 执行脚本:./git-author-rewrite.sh
  3. 验证修改结果:git log --author="company_name" --pretty=format:"%h %an %ae %s" | head -10

4. 推送修改

由于修改了历史记录,需要强制推送:

git push origin --force --all
git push origin --force --tags

给团队成员的提示

其他团队成员需要执行以下命令来更新他们的本地仓库:

git fetch origin
git reset --hard origin/<branch_name>

预防措施

检查Git配置

# 查看局部用户名和邮箱
git config user.name
git config user.email

# 配置仓库局部信息
git config --local user.name "yourname"
git config --local user.email "[email protected]"
  • 在开始新项目前,先检查并设置正确的Git配置
  • 建议使用项目级别(--local)的Git配置,避免全局配置带来的混淆
  • 建议公司在代码仓库中添加邮箱域名检查机制

通过这次经历,让我们记住在开始新项目时,第一件事就是确认 Git 配置信息是否正确。毕竟,预防胜于治疗!