可以通过使用 Git 的 filter-branchfilter-repo 工具来更改所有历史提交中的 user.nameuser.emailfilter-repo 是推荐的方法,因为它更快且更容易使用。以下是如何使用这两个工具的详细步骤:

使用 git filter-repo

首先,你需要确保安装了 git-filter-repo。如果没有安装,可以通过以下命令安装:

1
2
3
4
5
# For Ubuntu/Debian
sudo apt-get install git-filter-repo

# Or if you are using pip
pip install git-filter-repo

安装完成后,可以按照以下步骤操作:

  1. 备份你的仓库:这是一个破坏性操作,建议在开始之前备份你的仓库。

  2. 运行 git filter-repo 命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    git filter-repo --name-callback '
    if commit.committer.name == b"old_name":
    commit.committer.name = b"new_name"
    if commit.committer.email == b"old_email@example.com":
    commit.committer.email = b"new_email@example.com"
    if commit.author.name == b"old_name":
    commit.author.name = b"new_name"
    if commit.author.email == b"old_email@example.com":
    commit.author.email = b"new_email@example.com"
    '

    请将 old_nameold_email@example.com 替换为你想要修改的原始名称和邮件地址,new_namenew_email@example.com 替换为新的名称和邮件地址。

经尝试,该方法会出错,需要进一步研究

使用 git filter-branch(不推荐)

虽然 git filter-branch 已被弃用,但你仍然可以通过以下步骤来修改提交历史:

  1. 备份你的仓库:这个过程也是破坏性的,先备份你的仓库。

  2. 运行 git filter-branch 命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    git filter-branch --env-filter '
    OLD_EMAIL="old_email@example.com"
    CORRECT_NAME="new_name"
    CORRECT_EMAIL="new_email@example.com"

    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
    ' --tag-name-filter cat -- --branches --tags

    确保将 old_email@example.com 替换为你要修改的旧邮件地址,将 new_namenew_email@example.com 替换为新的名称和邮件地址。

推送更改到远程仓库

修改完成后,你需要强制推送到远程仓库:

1
2
git push origin --force --all
git push origin --force --tags

请注意,强制推送会覆盖远程仓库的历史,确保所有协作者都知道这次更改,并且在推送之前进行协调。

这些操作会重写 Git 历史,因此可能会影响到其他克隆了该仓库的协作者,请确保所有人都同意这次变更,并做好沟通工作。