如何重新创作 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,用edits 替换picks,然后运行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 存储库中的所有提交? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

GIT-搜索存储库中的所有提交

如何转换 git 存储库中的大量提交 [重复]

Git:如何提交手动删除的文件? [复制]

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

如何从远程存储库中取消提交所有文件

如何在不从磁盘中删除文件的情况下 git rm 文件? [复制]