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

spe*_*ane 2 git

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

Ste*_*ngs 5

这样做的标准方法是使用git-filter-branch. 这使您可以浏览提交历史并以某种方式重写每个提交。在您的情况下,假设您不小心提交passwords.txt并需要将其从您的历史记录中删除。

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

git filter-branch --index-filter 'git rm --cached --ignore-unmatch passwords.txt' HEAD
Run Code Online (Sandbox Code Playgroud)

一块一块:

  • git filter-branch : 改写历史。

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

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

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

完成后,除了缺少passwords.txt. 由于您已经重写了历史记录,因此您需要警告与您共享存储库的任何人,他们必须从您的上游 rebase 中恢复

例如,如果你的历史看起来像这样,并且提交 BC 被污染了:

A ---- B ---- C ---- D ---- E
Run Code Online (Sandbox Code Playgroud)

完成后,您的历史记录现在将如下所示:

A
 \
  B' ---- C' ---- D' ---- E' 
Run Code Online (Sandbox Code Playgroud)

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

有关使用的更多信息git-filter-branch可以在 Pro Git 书“重写历史”部分找到