更改所有提交的 git 作者信息对我的一个存储库有效,但对其他存储库无效,为啥?

Posted

技术标签:

【中文标题】更改所有提交的 git 作者信息对我的一个存储库有效,但对其他存储库无效,为啥?【英文标题】:Changing git author info on all commits worked on one of my repos but not the others, why?更改所有提交的 git 作者信息对我的一个存储库有效,但对其他存储库无效,为什么? 【发布时间】:2020-04-22 16:54:08 【问题描述】:

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

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

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

收件人:姓名:That,电子邮件:that@domain.com

因此我关注了来自 GitHub 的 these instructions 并将代码修改为以下内容:

#!/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 上这是可行的,在我使用来自 instrucitons Sublime Merge 的 git push --force --tags origin 'refs/heads/*' 之前,它显示了潜在的变化,并且在运行推送之后,所有提交现在都更新为所需的详细信息。

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

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

【问题讨论】:

你究竟是如何运行这个脚本的(例如,工作目录是什么,你用什么命令来运行它)?它工作的一个存储库的输出是什么?其他存储库的输出是否不同?是否有任何错误消息? 其他存储库的作者和提交者是否与脚本工作时相同,或者只有相同的作者,或者只有相同的提交者(您在问题文本中说“相同的提交者”,但脚本更改了作者)? 感谢您的帮助,我似乎缺少 AUTHOR 和 COMMITTER 数据,请参阅下面的答案。 【参考方案1】:

更好的选择是使用新工具git filter-repo,即replaces BFG and git filter-branch。 请参阅其user manual。

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

git filter-repo --mailmap my-mailmap

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

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

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

请参阅git shortlog "mapping author" section 了解邮件映射文件的确切语法。

或者,callbacks:

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")'

【讨论】:

感谢您提供此信息,我已经使用我发布的旧方法更改了我的 repos 上的作者详细信息,但我很快会在测试 repo 上尝试一下,这似乎是一种更简单的方法未来。【参考方案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/*'

【讨论】:

以上是关于更改所有提交的 git 作者信息对我的一个存储库有效,但对其他存储库无效,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

提交后将 git 存储库和工作目录复制到另一个位置,在检查状态时给出“未暂存的更改”

如何在 Git 中更改多个提交的作者和提交者姓名和电子邮件?

如何从特定修订版更改 GIT 中提交的作者 [重复]

删除远程 git 存储库中的合并和提交

如何在 Git 存储库中按作者计算每个文件路径名的提交次数?

Git索引和提交很慢