更改所有提交的 git author 信息适用于我的一个存储库而不是其他,为什么?

big*_*rge 4 git github sublimemerge

我有各种私有的GitHub 存储库并使用Sublime Merge来管理我的提交。

我想更改所有以前的提交作者详细信息

来自姓名:This,电子邮件:this@domain.com

收件人:姓名:那个,电子邮件:那个@domain.com

因此,我遵循了 GitHub 上的这些说明,并将代码修改为以下内容:

#!/bin/sh

git filter-branch -f --env-filter '

CORRECT_NAME="That"
CORRECT_EMAIL="that@domain.com"

export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"

' --tag-name-filter cat -- --branches --tags
Run Code Online (Sandbox Code Playgroud)

在其中一个存储库中,这是有效的,在我git push --force --tags origin 'refs/heads/*'从指令中使用 Sublime Merge 之前,它显示了潜在的更改,并且在运行推送后,所有提交现在都更新为所需的详细信息。

一切都很好,所以我想,直到我在我的其他几个存储库中尝试了这个,并且 sublime 中没有显示任何变化并且推送没有任何作用。我不知道为什么会有不同。其他存储库的相似之处在于它们都具有相同的原始提交者。

为什么这对其他存储库不起作用,我该如何修复以允许我进行更改?

Von*_*onC 6

更好的选择是使用新工具git filter-repo,它取代了 BFG 和git filter-branch.
请参阅其用户手册

要修改提交的用户名和电子邮件,您可以创建一个 .mailmap 文件接受的格式git-shortlog
例如,如果您有一个名为 my-mailmap 的文件,则可以运行

git filter-repo --mailmap my-mailmap
Run Code Online (Sandbox Code Playgroud)

如果该文件的当前内容如下(如果指定的邮件映射文件是版本控制的,则忽略该文件的历史版本):

Correct Name <correct@email.com> <old@email.com>
Run Code Online (Sandbox Code Playgroud)

然后我们可以根据指定的映射更新用户名和/或电子邮件。

有关邮件映射文件的确切语法,请参阅git shortlog“映射作者”部分

或者,使用回调

git-filter-repo --name-callback 'return name.replace(b"OldName", b"NewName")' \
   --email-callback 'return email.replace(b"old@email.com", b"new@email.com")'
Run Code Online (Sandbox Code Playgroud)