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

本文最后更新于:1 天前

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

前言

在折腾博客的头图的时候,不小心将很大的,而且用不上的图片放在了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之类格式的文件拖到这个里面,打开终端输入命令

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

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

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

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

1
2
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还有一个用法就是删除指定名字的文件

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

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

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

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

1
2
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 :

1
$ 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 :

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

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

有趣的事

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

1
2
3
4
5
6
--
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
--

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

参考文章

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


git删除大文件怎么办?BFG帮你忙
https://www.yikakia.com/git删除大文件/
作者
Yika
发布于
2020年3月3日
许可协议