我需要删除1年前提交的提交,因为它们包含必须删除的敏感数据。
我使用过BFG Repo-Cleaner,并且几乎可以删除所有内容,但是有一些非常老的提交没有被删除。
我将尝试写一个例子; GIT历史看起来像这样
( A 是最早的提交, C 是最新的提交)
这就是我所需要的( B不再存在,但以后的提交不受影响):
我正在一个大团队中工作,因此,除非没有其他选择,否则我将避免使用git push -f
。
实现此目标的最佳方法是什么?
非常感谢。
(编辑)
这样做的原因是,我们对我们的存储库进行了定期扫描,将提交A视为漏洞。
我们删除了所有凭证和秘密文件后,就做出了提交B,问题是扫描也将提交B视为“安全问题”。
我们被要求删除提交B以通过扫描。
答案 0 :(得分:2)
TL; DR
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上的其他建议