git - 从 git 历史记录中删除垃圾邮件

标签 git rebase spam git-filter-branch

我已经“继承”了一个脏的 git 存储库,其中包含大约 5k 次有效提交和大约 50k 次垃圾邮件提交(这是曾经是世界可写的 wiki 的编辑历史记录)。我们正在迁移格式,因此这是改写历史的好时机。我不想完全放弃历史记录,但无论是提交量还是原始内容量,垃圾邮件都是压倒性的。回滚到最后一次好的提交的旧节制技术留下了很多垃圾。

使用 git log -S 我可以轻松找到大约 80% 的错误提交。和一些正则表达式工作。大多数垃圾邮件内容非常明显。问题是我不确定如何处理我想要删除的大量提交列表。

注意我很熟悉 git并使用 git rebase每小时一次(除非 git revise 已经接管了大量负载),我知道如何手动完成此操作,但我需要一个自动化的解决方案。通常我会求助于 git filter-branch ,但我不确定使用什么工具来检查当前的差异。

我想过编写一个脚本来操作 rebase 脚本,但我认为这会给我带来误报的麻烦。我可能可以捕获并丢弃原始的污损和回滚,但是当我错过了等式的一侧时会发生什么?我希望可能匹配的其余部分在其中一个没有干净地 rebase 时成功而不是失败。

注意我不想根据我的匹配操作文件的内容或添加/删除文件,我想检查补丁的内容并决定根据它选择或删除。

什么是最好的 git要达到的工具?

最佳答案

一种可能的解决方案,涉及 git rebase :
您提到您可以确定要删除哪些提交,并且 rebase 期望选择(或甚至删除)提交列表。但是您不能简单地删除,因为这样您的“还原”提交也需要删除(并且它们可能包含不相关的更改?)。
考虑以下 rebase 脚本:

pick A normal edit
pick B spam
pick C spam
pick D spam
pick E spam
pick F revert spam
pick G normal edit
我假设您想“删除”所有垃圾邮件和还原提交的更改。这可以通过以下 rebase 脚本来实现:
pick A normal edit
fixup B spam
fixup C spam
fixup D spam
fixup E spam
fixup F revert spam
pick G normal edit
如果您有要“删除”的提交列表(包括“还原”提交),您应该可以通过 sed 提供它或类似的工具用 fixup 替换所有匹配的行而不是 pick .
如果您可以通过提交主题识别错误提交,那就更容易了。

关于git - 从 git 历史记录中删除垃圾邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57478395/

相关文章:

git - 如何在使用 git pull --rebase 时自动保留 merge 提交?

azure - 所有通过 Sendgrid 拦截的电子邮件,如何重新发送电子邮件?

php - 从 MySQL 数据库表中删除垃圾邮件

git - git fetch 和 git merge 之间的概念区别?为什么他们对我有同样的感觉?

git - 如何查看 git 索引的变化?

git - 无法 curl git 标签

混帐 : How to get a snapshot of a git repository

git - 了解 git 问题以及分支上的 rebase 和意外提交以及未完成的提交

Git rebase 在冲突时自动中止

email - 为什么 Gmail 会因为我们的电子邮件不符合 RFC 2822 而被拒绝?