更改所有提交的 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】:我发现我没有同时包含 AUTHOR
和 COMMITTER
详细信息:
在 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 中更改多个提交的作者和提交者姓名和电子邮件?