0%

记一次删.git中大文件的经历

真nm折磨啊

另记git的一些使用

起因

某天我手贱地把hdu多校的资料也放到了仓库里,然后commit&push了,然后想着太大了转移到了硬盘里,commit&push之后就没管。

然后今天jby说clone很慢,然后我看了一眼网站文件的大小,不看不知道,一看吓一跳,整整800MB,然后开始找哪里大了,最后发现单单.git就有750MB,于是就开始了简(折)单(磨)的删.git大文件。

资料

网上的一些博客:

https://blog.csdn.net/qq_39054069/article/details/107401872 https://www.cnblogs.com/geoffreyone/p/14603537.html https://cloud.tencent.com/developer/article/1903754 https://blog.csdn.net/gmq_syy/article/details/129876180

解决过程

git count-objects -vH可以看到当前git总大小,不出意外的是贼大,那么就开始解决。

首先先把大的文件找出来:

1
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5

其中git verify-pack -v .git/objects/pack/pack-*.idx命令大概是把当前git中所有保存的包全部输出,然后通过管道传给sorttail排序输出文件大小最大的5项。

只不过返回的是文件在git中的id号,还不是文件名称,要得到名称需要使用:

1
git rev-list --objects --all | grep <id>

其中git rev-list --objects --all命令把所有文件的(id,name)输出,后通过grep正则匹配所需的文件id

然后删除对应文件:

1
git filter-branch --index-filter 'git rm --cached --ignore-unmatch <your-file-name>'

但是删除之后还需要很多步操作,什么git gc之类的我完全不知道是干啥用的命令。

这里git会报一个WARNING,推荐使用git filter-repo来进行删除操作,然后去github上把git-filter-repo下载下来安装,之后直接:

1
git filter-repo --path <file-path> --invert-paths --force

把想要删除的文件路径输进去就好,git-filter-repo会自动完成后续操作,十分方便。

然后在push的时候还要把gitlabbranch protected关了,不然就会报错error: failed to push some refs to <remote address>

后续

其实总的过程还是很简洁的,但是由于是第一次,所以搞了我几个小时才搞好,而且还遗留下来了一些问题。不知道为什么本地的文件大小已经变小了,但是远程仓库的大小反而更大了,可能这个就要在服务器上操作了,也不是很懂。