脚本用于批量修改 Git 历史提交的作者信息,通过 git filter-branch 重写历史提交记录。
您提供的脚本用于批量修改 Git 仓库历史提交中的作者信息,整体思路是正确的,但在 git filter-branch
的 --env-filter
中使用数组(如 OLD_EMAILS=("...")
)可能会导致兼容性问题,因为某些 shell 环境(如 /bin/sh
)并不支持数组语法。
为提高兼容性,建议将数组替换为以空格分隔的字符串,并使用 for
循环遍历每个旧邮箱地址。以下是修改后的脚本示例:
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAILS="TianlongXiang51@gmail.com nick@qq.com tianlongxiang51@gmail.com"
CORRECT_NAME="tianlong.xiang"
CORRECT_EMAIL="tianlong.xiang@foxmail.com"
for OLD_EMAIL in $OLD_EMAILS
do
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
done
' --tag-name-filter cat -- --branches --tags
注意事项:
-
在执行此脚本之前,建议备份您的仓库,以防止意外情况发生。
-
此操作会重写 Git 历史,修改提交的作者信息,可能会导致提交哈希值发生变化。
-
如果您已经将更改推送到远程仓库,需要使用强制推送:
git push --force --tags origin 'refs/heads/*'
请谨慎使用强制推送,尤其是在多人协作的项目中,以避免对他人造成影响。
统计仓库所有的不重复作者邮箱
git log --format='%an <%ae>' | sort -u