如何在不影响历史记录的情况下删除旧提交

时间:2019-07-03 08:14:56

标签: git bfg-repo-cleaner

我需要删除1年前提交的提交,因为它们包含必须删除的敏感数据。

我使用过BFG Repo-Cleaner,并且几乎可以删除所有内容,但是有一些非常老的提交没有被删除

我将尝试写一个例子; GIT历史看起来像这样

  • C ->秘密文件不存在
  • B ->秘密文件已删除
  • A ->添加了秘密文件

A 是最早的提交, C 是最新的提交)

这就是我所需要的( B不再存在,但以后的提交不受影响):

  • C ->秘密文件不存在
  • A ->添加了秘密文件

我正在一个大团队中工作,因此,除非没有其他选择,否则我将避免使用git push -f

实现此目标的最佳方法是什么?

非常感谢。

(编辑)

这样做的原因是,我们对我们的存储库进行了定期扫描,将提交A视为漏洞。

我们删除了所有凭证和秘密文件后,就做出了提交B,问题是扫描也将提交B视为“安全问题”。

我们被要求删除提交B以通过扫描。

1 个答案:

答案 0 :(得分:2)

TL; DR

  • 您必须重写提交A以首先不包含敏感文件
  • 您必须使用git push -f
  • 您还没有完成:您仍然必须清除服务器上的历史记录

重写提交A和整个历史记录

这应该是bfg为您所做的。我假设您运行了类似bfg --delete-files <sensitive-file>的程序。这应该创建了一个全新的历史记录,其中<sensitive-file>从未存在过:添加或修改了它的提交以及其他文件,应该在没有该文件的情况下进行重写。只是碰到它的提交应该消失,因为它们现在是空的提交。

因此,现在您提交了A',即没有<sensitive-file>的A的副本。历史的其余部分被重写为其继承人:C'等。

要确认此操作是否正确发生,请在旧沙箱和bfg更新的新沙箱中运行此命令:

git log --all <sensitive-file>

您应该看到提交在原始存储库中触摸了敏感文件,但在新存储库中没有输出。这样您可以确定文件确实已从历史记录中删除。

您必须使用git push -f

Git提交的sha1是提交,其所有元数据(提交者,日期,注释等),其所有内容以及其所有历史的加密签名。

如果您更改提交的任何一个方面:日期,注释,内容或其任何祖先的任何一个方面,则加密签名都会根据定义发生更改。

所以前进的唯一途径是git push -f

您可能还没有完成

但是等等,git push -f之后,服务器仍将保留旧历史记录的副本。参见GitHub:If you pushed to GitHub, it is too late even if you force push it away one second later。显然,从GitHub存储库中删除敏感文件的唯一真正安全的方法是删除该文件,然后仅使用您要保留的干净历史记录重新创建一个新文件。还有其他解决方案,但您的里程可能会有所不同-链接文章中的详细信息。

如果您使用的是其他Git服务器或私有Git服务器,请确保强制进行垃圾回收并遵循Remove sensitive files and their commits from Git history上的其他建议