Git修改历史记录中的递交信息

脚本用于批量修改 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
Licensed under CC BY-NC-SA 4.0
最后更新于 2025年05月24日 01:17
金融IT程序员的瞎折腾、日常生活的碎碎念
使用 Hugo 构建
主题 StackJimmy 设计