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 中没有显示任何变化并且推送没有任何作用。我不知道为什么会有不同。其他存储库的相似之处在于它们都具有相同的原始提交者。
为什么这对其他存储库不起作用,我该如何修复以允许我进行更改?
更好的选择是使用新工具git filter-repo
,它取代了 BFG 和git filter-branch
.
请参阅其用户手册。
要修改提交的用户名和电子邮件,您可以创建一个 .mailmap 文件接受的格式
git-shortlog
。
例如,如果您有一个名为 my-mailmap 的文件,则可以运行Run Code Online (Sandbox Code Playgroud)git filter-repo --mailmap my-mailmap
如果该文件的当前内容如下(如果指定的邮件映射文件是版本控制的,则忽略该文件的历史版本):
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)