真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中所有保存的包全部输出,然后通过管道传给sort
和tail
排序输出文件大小最大的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
的时候还要把gitlab
的branch protected
关了,不然就会报错error: failed to push some refs to <remote address>
。
后续
其实总的过程还是很简洁的,但是由于是第一次,所以搞了我几个小时才搞好,而且还遗留下来了一些问题。不知道为什么本地的文件大小已经变小了,但是远程仓库的大小反而更大了,可能这个就要在服务器上操作了,也不是很懂。