git 删除大文件怎么办?BFG 帮你忙

本文最后更新于:2020年5月13日 晚上

谁掌控了过去谁就掌控了未来

前言

在折腾博客的头图的时候,不小心将很大的,而且用不上的图片放在了 git 的提交历史里面。昨天还没想到有啥问题,虽然出现了问题的征兆,就是上传到服务器的时候速度很慢。不过我硬是靠设置 gitpostBuffer 为 500M 而强行解决了问题。但今天突然想起这个问题,仔细思考了一下,不对啊,git 的特性决定了你提交了什么东西,他就会永远留在 git 仓库里面呀,那这个样子岂不是很不妙?

于是我上网搜了下 git 的工作机制,发现还真是这样,这个怎么办?于是再搜了下,发现 git 早已对此有了预案,那就是 git filter-branch 命令。不过看了 官方的文档 也没看出来该怎么用,试了下也没折腾出来,本来以为凉了,不过还好在 Github 的 相关网页 看到了还有别的工具,那就是本文的重点介绍 BFG

BFG 的使用

就先把 BFG 的官方网站放出来吧,点这里

需要注意的是,该工具是.jar 格式的,也就是说你得安装一个 java 才能运行。虽然我学了 java,但对这个一窍不通,所以也没啥好说的,去官网下一个就行了。不过因为 Windows 的原因,所以得注销一下 java 才写进环境变量,具体的我在 建站心得 里面说过有兴趣的可以去看看。

那么开始正文吧

删除大于 10M 的文件

我们现在假设 ~ 代表你的 hexo 博客的主目录,那么我们到 ~\.deploy_git 里,把你在官方网站下的 bfg-1.13.0.jar 之类格式的文件拖到这个里面,打开终端输入命令

java -jar .\bfg-1.13.0.jar --strip-blobs-bigger-than 10M

这个的意思是删除大于 git 仓库中大于 10M 的文件。当你看到如下的提示的时候,就说明成功了。

BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive

不过就像他所提示的那样,还要再做点动作才能正式删除那就跟着他做呗。不过 Windows 下的命令貌似不支持用 && 连接两条,所以就分开做吧。

git reflog expire --expire=now --all
git gc --prune=now --aggressive

现在就好了,彻底删除了大于 10M 文件,改写了提交的历史。现在你可以看看 .deploy_git 这个文件夹是不是比之前小了很多啊。
举一反三一下,把之前命令的 10M 换成 50M 也是可以的。

不过每次都输 .\bfg-1.13.0.jar也太麻烦了,就算按 Tab 自动补全也是,还是把 bfg-1.13.0.jar 的名字改成 bfg.jar 吧。

删除指定名字的文件

BFG 还有一个用法就是删除指定名字的文件

java -jar .\bfg.jar --delete-files YOUR FILE NAME

这里把你要删的文件名替换那个 YOUR FILE NAME 就好了,当你和上面一样看到

BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive

这样的提示的时候,说明就工作完成了,和之前一样输入两行命令删除掉他吧。

git reflog expire --expire=now --all
git gc --prune=now --aggressive

其他我没用过的指令

看官方网站的 Usage 的话会发现其实还有些其他用法,不过我没用过,就在这里也一并列出来吧

替换指定文件的所有内容

替换你的仓库里出现的文件中列出的所有密码(如果需要,请在前缀行’regex:‘或’glob:’)处替换为 REMOVED
Replace all passwords listed in a file (prefix lines ‘regex:’ or ‘glob:’ if required) with REMOVED wherever they occur in your repository :

$ bfg --replace-text passwords.txt  my-repo.git

删除所有名为 .git 的文件夹

删除所有名为“ .git”的文件夹或文件 -Git 中的保留文件名。 当从 Mercurial 等其他源代码控制系统迁移到 Git 时,这些通常会成为问题:
Remove all folders or files named ‘.git’ - a reserved filename in Git. These often become a problem when migrating to Git from other source-control systems like Mercurial :

$ bfg --delete-folders .git --delete-files .git  --no-blob-protection  my-repo.git

用了谷歌娘机翻,也润色了一点,实际的使用的话还是去网上找实例看看吧。
顺便上面的那个 bfg就替换成 java -jar .\bfg.jar 吧,Windows 平台的话。

有趣的事

现在是 2020/3/3 可能美国正在进行大选或者川普现在有啥丑闻?
总之我清理完了后 bfg 会弹出这么一个提示

<!–hexoPostRenderEscape:

You can rewrite history in Git - don’t let Trump do it for real!
Trump’s administration has lied consistently, to make people give up on ever
being told the truth. Don’t give up: https://www.rescue.org/topic/refugees-america

:hexoPostRenderEscape–>
不知道你用的时候会有这个提示么?

参考文章

使用 BFG Repo-Cleaner 清除 git 的历史错误提交
Git 工具 - 重写历史
an alternative to git-filter-branch