如何重新创作 Git 存储库中的所有提交? [复制]
Posted
技术标签:
【中文标题】如何重新创作 Git 存储库中的所有提交? [复制]【英文标题】:How to reauthor all commits in a Git repository? [duplicate] 【发布时间】:2021-03-27 20:30:44 【问题描述】:我不小心在不同的 GPG 密钥、电子邮件、名称等下向本地未推送的 Git 存储库提交了一些(大约 20 次)提交。如何在其他配置下对所有提交进行辞职/重新创作?
重新编写所有次提交的答案会很好,因为所有提交都是由我编写的,但可以针对某个作者的解决方案也很好。
Bash 脚本可以工作,但我目前在 Windows 上。我必须打开 WSL 并从那里运行 bash 脚本。 PowerShell 中的答案将不胜感激,因为它是跨平台的。如果它可以在单个 Git 命令中完成,那也很棒。谢谢。
【问题讨论】:
如果使用链接的答案,您可以使用git filter-branch
并指定不会更改整个历史记录的未推送提交范围 (@u..@
)。如果我想让它简单快速(尤其是filter-branch
非常复杂),我会为提交范围运行交互式rebase,用edit
s 替换pick
s,然后运行git commit --amend --reset-author --no-edit && git rebase --continue
直到变基完成。
@fluffy : 或使用 -x
选项变基 : git rebase -i ... -x "git commit --amend --reset-author --no-edit"
@LeGEC 太棒了!我真的曾经认为--interactive
总是只需要一个 TODO 序列,因此没有假设通过命令行指定序列。现在我看到-x
非常适合这种情况,因此即使-i
在这里也没有必要。很高兴每天都知道 git 上的新事物。谢谢你的建议!
【参考方案1】:
当前选项(在 python 中,同样跨平台)是使用git filter-repo
,它替换了old obsolete git filter-branch
or BFG
它带有User and email based filtering,并且可以使用一行:
git filter-repo --mailmap my-mailmap
my-mailmap
:
Correct Name <correct@email.com> <old@email.com>
【讨论】:
以上是关于如何重新创作 Git 存储库中的所有提交? [复制]的主要内容,如果未能解决你的问题,请参考以下文章