我已经“继承”了一个脏的 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/