删除特定日期之前的 Git 历史记录

删除特定日期之前的 Git 历史记录

我意外地将一些敏感信息提交到了公共 git 存储库(哎呀!)。有什么方法可以永久删除某个日期范围内的所有历史记录吗?我是否应该删除整个存储库并重新开始?

答案1

标准做法是git-filter-branch。这可让您浏览提交历史记录并以某种方式重写每个提交。在您的例子中,假设您意外提交passwords.txt并需要将其从历史记录中删除。

您运行的命令可能如下所示:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch passwords.txt' HEAD

逐一说明:

  • git filter-branch:改写历史。

  • --index-filter:对于每次提交,我们希望以某种方式改变索引,然后重新提交。

  • 'git rm --cached --ignore-unmatch passwords.txt':对于每次提交,通过运行以下命令更改索引git-rmpasswords.txt命令。这将删除索引中指定的任何文件。

  • HEAD:重写当前签出的分支的历史记录。

完成后,您将获得一个全新的提交,其历史记录与 完全相同,只是缺少passwords.txt。由于您重写了历史记录,因此您需要警告与您共享存储库的任何人,他们必须从上游 rebase 中恢复

例如,如果你的历史记录如下所示,并且 BC 的提交被污染了:

A ---- B ---- C ---- D ---- E

完成后,你的历史记录将如下所示:

A
 \
  B' ---- C' ---- D' ---- E' 

请注意,D 和 E 已被重写为 D' 和 E'。它们可能指向相同的树,但由于历史记录已更改,它们将具有新的提交 ID,并且就 Git 而言被视为新的提交。

有关使用的更多信息,git-filter-branch请参阅Pro Git 书中的“重写历史”部分

相关内容