BFG Repo-Cleaner

答辩前这几天相对自由时间比较多,总想着找点事情来做

于是便想着把在互娱实习期间做的游戏从gitee搬到github方便统一管理

为了保留commit记录,照上一次从gitee搬运dragonNest至github的经验来看,从gitee clone下来后修改.git文件夹下的config然后暴力git push –force就完事了

然鹅,这一次事情没有这么简单就完事

$ Large files detected. You may want to try Git Large File Storage.

push到最后git报了个error,大概意思就是有个文件超过100M了,不让传

我看了下目录果然里面有个300M+的psd文件没删(不知道谁传到gitee的,晕)

我寻思着删了再push一遍就完事了

然鹅,同样的错误又再次出现了,这还没完没了了???

网上很多博客里推荐的处理方式是这样子的

$ git filter-branch --force --index-filter  'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA'  --prune-empty --tag-name-filter cat -- --all

$ echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
$ git add .gitignore
$ git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

但是我自己试了试还是没什么用,我开始怀疑fliter-branch到底有没有删掉大文件commit记录

于是又试了试下面的方法

显示10个最大的文件id列表
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -10

根据文件id查询文件路径
git rev-list --objects --all | grep <SHA>

移除文件
git log --pretty=oneline --branches -- <file>

删除文件的历史记录
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch --ignore-unmatch <file>' --prune-empty --tag-name-filter cat -- --all

找到这个方法的时候,我一度感觉抓住了希望,查询移除都没有报错,查询得到的文件路径和commit SHA都没有问题,但是最后push的时候还是出现了最初的那个error(至今我仍旧不知道问题出在哪里…)

最后的最后,其实最终这个问题还是解决了的

在找解决办法逛youtube的时候看到了这么个视频

好奇的我点进去看了看,顺便了解了BFG这个东西,看完之后不明觉厉 /捂脸

试了试这个BFG之后,还真就解决了大文件历史记录无法删除那个问题

具体流程如下

Ⅰ. $ git clone --mirror your_repo.git

默认你下的是bfg-1.13.0.jar这个版本,在clone完repo之后把jar包扔到clone的那个文件夹

Ⅱ.$ java -jar bfg-1.13.0.jar --no-blob-protection --strip-blobs-bigger-than 300M your_repogit.git

需要注意的是上面的dougeon_demo.git指的是clone下面的.git文件夹的名字,不是repo的那个.git

上面这一步是用来删除大于300M的文件相关的commit的提交分支与标记,但是实际我们版本库里面还没有删除,还需要最后一步

Ⅲ.
$ cd your_repogit.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive

如果成功删除就会有上图所示的complete提示

ps.最后BFG作者这私货真的笑到我了,呵,男人

最后直接push就好

Ⅳ. $ git push

git提交更新完之后我们重新从gitee clone repo然后再照老方法修改.git的config再force push就完事了

最后贴个BFG作者的地址,听不懂我胡扯的可以看作者的

https://rtyley.github.io/bfg-repo-cleaner/