从 Git 历史记录中删除敏感数据

2025-05-27

从 Git 历史记录中删除敏感数据

如果您将敏感数据推送到公共存储库,请假设它已被篡改并更改!
我想我们都经历过这种情况:不小心将机密信息(访问令牌、密码、连接字符串等)推送到远程 git 服务器,然后立即开始抓狂。或者也许只有我这样🤷🏽。总之,幸运的是,我以前确实这样做过,并且找到了一个重写历史记录的好工具!BFG是一款工具,可让您彻底清理 git 存储库并删除所有可能意外提交的敏感数据,而且幸运的是,它使用起来非常简单,速度也非常快🚀。继续下载 jar 文件,并确保您的计算机上已安装 Java 才能运行它。

删除敏感数据(数据也有感情)

  1. 从你的文件中删除机密信息并提交到你的主分支。我们必须这样做的原因是,HEAD 提交被视为受保护的提交,BFG 工具不会触及它。
git commit -m "Oops"
Enter fullscreen mode Exit fullscreen mode
  1. 获取仓库的全新克隆。您需要--mirror在此处使用标志,因为我们只需要 git 历史记录,而不是仓库中的所有实际文件。
git clone --mirror your_repo_url
Enter fullscreen mode Exit fullscreen mode
  1. 保存此新克隆的副本,以防万一发生任何不好的事情。
  2. 创建一个新.txt文件并添加要删除的敏感信息。每个条目应单独占一行。BFG 将在整个 git 历史记录中搜索这些键的任何出现位置。
superawesomeapikey1
password123
Enter fullscreen mode Exit fullscreen mode
  1. 运行命令将所有出现的秘密替换为***REMOVED***
java -jar bfg.jar --replace-text secrets.txt  your_repo.git
Enter fullscreen mode Exit fullscreen mode

— 注意:除了替换文本之外,您还可以运行许多其他命令。查看它们的文档以了解所有命令。

  1. 将您的目录更改为您的 git repo 并运行以下命令以删除所有“脏”数据。
cd your_repo
git reflog expire --expire=now --all && git gc --prune=now --aggressive
Enter fullscreen mode Exit fullscreen mode

此命令实际上是由&&运算符连接在一起的两个命令。这看起来有点复杂,但让我们尝试分解一下:

git reflog expire --expire=now --all
Enter fullscreen mode Exit fullscreen mode

首先,reflog这里是“引用日志”的缩写。引用日志只是记录你的 git 历史记录(分支、提交)在 git 仓库中的最后更新时间。expire --expire=now这个命令告诉 git 删除所有旧git reflog条目。最后,我们添加一个标签--all,告诉 git 我们希望此操作在所有引用上运行。

git gc --prune=now --aggressive
Enter fullscreen mode Exit fullscreen mode

其次,我们运行git gc命令。此命令本质上是清理你的仓库。--prune=now告诉 git 删除所有对孤立或无法访问的 git 对象的引用。--aggresssive告诉 git 牺牲速度以尽可能地清理所有内容。

  1. 一旦本地存储库中的所有内容看起来都很好,就可以使用以下简单方法将其推送回远程存储库:
git push 
Enter fullscreen mode Exit fullscreen mode

现在,您在文件中指定的所有机密都secrets.txt将被替换为***REMOVED***

这样你的 git 历史记录就干净了!🎉 这里需要注意的一点是,如果你和其他人在一个团队里工作,你需要确保他们做了一件新的事情git clone。感谢阅读!记得给BFG点赞,在GitHub上他们的仓库上点个星

文章来源:https://dev.to/jeff_codes/removing-sensitive-data-from-git-history-5g63
PREV
面向所有开发人员的免费真实 Web 开发项目
NEXT
JavaScript Debounce,最简单的解释!(附代码)