欢迎光临BDM
一枚菜鸟码农的成仙之路

BFG 介绍 – 删除 GIT 历史记录中的敏感文件

Git 如果不甚提交了敏感文件,如包含了数据库密码、真实 IP 地址的文件,如何解决呢?

笔者前几天就遇到了这个问题,Git 提交过程不甚把这种敏感文件提交了,如果是本地 Git 服务器或私有仓库还好办,几乎不需要考虑这些问题,但是公有性质或者可能变为公有性质的仓库,就不得不多加留心了,轻者拖库删库,重者倾家荡产。

下面介绍解决该问题的几种方法,均来自 GitHub,本文主要对其中一些概念模糊的部分作说明。

如果不是短短两三天之内又发生了一次提交数据库密码的蠢事,我绝对懒得写下这篇文章

删除敏感文件,再 Commit 一次

容易想到的解决办法,就是删除该文件,再 Commit 一次,但版本控制的魅力所在,就是不会放弃记录你留下的任何蛛丝马迹。

删除之后,版本历史中仍然会留下该文件,并且会记录下你欲盖拟彰的删除操作。只要将版本回到你删除之前的节点,就能直接获取到你删除的敏感文件。

所以,只有将历史版本中的该文件一并删除,才能解决问题。

删除历史记录

GitHub 官方推荐两种方式来删除历史,一种是 Git 的 git-filter-branch,一种是专门用于处理这类问题的开源软件 BFG。

从功能上说,BFG 没有 git-filter-branch 那么丰富,但是便于使用,并且速度极快。传统 git-filter-branch 处理我这 20+ commit 记录的仓库时,虽然敏感文件实际上仅存在于一两个版本内,但仍然需要十一分钟有余,而 BFG 不超过 10 秒便可以搞定。

不仅如此,git-filter-branch 用法详解实际上让我难以理解。相关文档涉及太多 Git 底层的术语,如果不弄清楚这些,又难以灵活运用。所以,最后我选择了 BFG 来解决我的问题。

BFG 官网及官方教程 https://rtyley.github.io/bfg-repo-cleaner/

BFG 依赖于 JRE,以单独的 Jar 包的形式提供调用。使用时直接使用Java进行调用,如:java -jar bfg.jar,当然也可以给 BFG 配置成环境变量,使用时直接使用 bfg 取代 Java 的 Jar 包调用方法,但一般人并不需要长期使用。官方的 jar 包下载下来时会带有版本号,修改名字或者修改命令均可。

BFG 教程第一步:克隆一个新的仓库

$ git clone --mirror git://example.com/some-big-repo.git

# 首先,一定要按照上述用法,新克隆一个镜像仓库。
# 这是我踩的坑之一。之前就是在原始的 git 仓库里操作半天,然后毫无效果。

有一个非常重要的操作:一定要把想删除的文件先 delete,接着 commit and push 到远程服务器,再进行 clone

否则若文件依旧存在于 Head 中,则会报如下错误,由于该文件被保护而无法删除。

Protected commits
-----------------

These are your protected commits, and so their contents will NOT be altered:

BFG 教程第二步:删除对应文件

$ java -jar bfg.jar --delete-files wait-delete-file-path  my-repo.git

# wait-delete-file-path 待删除文件的相对路径
# 可以支持一些匹配符,详细用法到官网查看
  • 如果这一步错了或者提示找不到文件,十有八九都是路径写错了。

  • 如果这一步路径没有写错,那么就已经实现了删除的功能。

除了删除以外,BFG 还支持大文件删除,敏感字符串(如密码)一键替换等功能,这里暂不介绍了。

BFG 教程第三步:推送回远程服务器

# 先进入仓库文件夹
$ cd my-repo.git

# 在仓库文件夹中进行
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive

# 如果跟我一样不了解上一句代码中是什么意思,先直接执行吧,这是 BFG 提示的。

# 推送回远程服务端
$ git push

至此,BFG 的操作已经全部完成。

总结

删除完成之后,回到远程服务器中,你会看到:

  • 相关涉及的版本号全部已经更改成新的版本号
  • 相关版本更改记录中的该文件已经不见了,甚至还会出现一些空的版本更改记录
  • GitHub、GitLab 等日志中仍然会如实记录你的这次修改操作,只能用时间来冲刷这一切,这并不能修改。

所以,尽量避免提交敏感文件才是问题的根本解决办法。

本文遵守知识共享署名-相同方式共享 4.0 国际许可协议,未经允许不得转载BigDickMan » BFG 介绍 – 删除 GIT 历史记录中的敏感文件

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

联系我们GitHub