一些时候由于开发初期经验不足和贪图方便, 会把一些不应该提交到 Git 的文件上传到 Github, 带来一系列安全问题, 更有可能是把一些大文件上传到 GitHub 上, 导致项目非常臃肿, 每次 pull、push 都要花费很多时间.
超 100000 个 GitHub 代码库泄露了 API 或加密密钥
关于如何更好的管理大文件, 可以阅读 更好的在 Git 项目中保存大文件(Git LFS 的使用) - 质子 - 博客园 .
这时候就可以寻求一些特殊的工具的帮助, BFG Repo-Cleaner by rtyley 就是这样一款工具, 可以从 Git 项目中彻底删除某一个文件的历史记录.
下载及运行
BFG Repo-Cleaner 是由 Scala (一种JVM语言) 写成, 所以会被编译成 jar 包, 下载非常方便, 下载地址可在官网或直接点击 bfg 下载地址 .
但因此运行 bfg.jar
就需要 Java 环境, 关于 Java 环境的安装, macOS可以参考 macOS 的 JDK 安装问题 , 而 Windows 已经有很多人提过, 不做赘述.
让它完全消失
首先需要自行从项目中删除不想要的文件并提交, 这样能最大程度避免误删、误操作.
## 首先需要自行从项目中删除不想要的文件
rm file-to-delete
## 提交改动, 即最新分支是不包含要被删除的文件
git commit -m "删除 file-to-delete"
git push
然后使用 --mirror
命令裸克隆(clone)整个项目.
git clone --mirror git@github.com:username/some-project.git
## 根据经验, 如果是包含大文件的项目, 使用 ssh 将会克隆的非常缓慢, 可以改用 https
git clone --mirror https://github.com/username/some-project.git
## 这个时候, 你的当前目录下就会产生一个名为 some-project.git 的文件夹
接着开始删除文件历史.
## 根据情况的不同, bfg 可选择根据文件大小删除
java -jar bfg.jar --strip-blobs-bigger-than 100M some-project.git
## 根据情况的不同, bfg 可选择直接根据名字删除
java -jar bfg.jar --delete-files name-of-file some-project.git
任选以上命令执行其中一个后, 执行 git gc
真正删除这些文件并提交.
cd some-project.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push
这时候那个文件就会消失了…