修复 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. 执行修改
- 给脚本添加执行权限:
chmod +x git-author-rewrite.sh
- 执行脚本:
./git-author-rewrite.sh
- 验证修改结果:
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 配置信息是否正确。毕竟,预防胜于治疗!