5

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

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

发件人姓名:这个,电子邮件:this@domain.com

收件人:姓名:那个,电子邮件:that@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

在其中一个 repos 上工作,在我git push --force --tags origin 'refs/heads/*'从 instrucitons 使用 Sublime Merge 之前显示了潜在的变化,并且在运行推送之后,所有提交现在都更新为所需的细节。

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

为什么这不适用于其他存储库,我该如何解决以允许我进行更改?

4

2 回答 2

12

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

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

git filter-repo --mailmap my-mailmap

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

Correct Name <correct@email.com> <old@email.com>

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

有关邮件映射文件的确切语法,请参阅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")'
于 2020-01-04T15:05:12.520 回答
2

我发现这看起来我没有包括两者AUTHORCOMMITTER细节:

在 repo 目录中的终端中:

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='New Name'; GIT_AUTHOR_EMAIL='new@email.com'; GIT_COMMITTER_NAME='New Name'; GIT_COMMITTER_EMAIL='new@email.com';" HEAD

然后:

git push --force --tags origin 'refs/heads/*'
于 2020-01-04T12:30:40.663 回答