gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:43:32 26 4
gpt4 key购买 nike

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

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

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

  • C -> secret 文件不存在
  • B -> secret 文件被删除
  • A -> 添加了 secret 文件

(A 是最旧的,C 是最新的提交)

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

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

我在一个大团队工作,所以除非没有其他选择,否则我想避免使用 git push -f

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

非常感谢。

(编辑)

这是因为我们定期扫描我们的代码库,将提交 A 检测为漏洞。

我们进行了提交 B,是否删除了所有凭据和 secret 文件,问题是扫描还将提交 B 检测为“安全问题”。

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

最佳答案

长话短说

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

重写提交 A 和整个历史

这应该是什么bfg为你做了。我假设你运行了类似 bfg --delete-files <sensitive-file> 的东西.这应该创造了一个全新的历史,其中 <sensitive-file>从不存在:添加或修改它的提交以及其他文件应该在没有该文件的情况下重写。只触及它的提交应该消失,因为它们现在是空提交。

现在您已经提交了 A',A 的副本没有 <sensitive-file> .其余的历史被重写为它的后继者: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 存储库中删除敏感文件的唯一真正安全的方法是删除它并重新创建一个只包含您想要保留的干净历史记录的新文件。还有其他解决方案,但您的情况可能会有所不同 - 链接帖子中有详细信息。

如果您使用的是不同的或私有(private)的 Git 服务器,请确保强制执行垃圾收集并遵循 Remove sensitive files and their commits from Git history 中的进一步建议。

关于git - 如何在不影响历史记录的情况下删除旧提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56865725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com