git-logo.jpg

新同事拉取仓库代码,结果报错pack - out of memory,我们是自己搭建的gitlab,一查服务器的仓库大小,文件有一个多G的大小,拉取代码时,服务器内存直接撑爆了,这就很奇怪了,因为我们的这个项目正常10M之内,这么大肯定是有问题的。

查了一下,发现是某个日志文件,每次提交100M,提交的次数过多,导致容量暴增,但是这个日志文件是可以忽略的,所以就需要把这个文件清理掉。如果你也是这种情况,可以查看后面的教程

git自带的命令和第三方工具,你可以选择任一方式进行处理

一、git自带的命令

1.1、找出提交过的大文件,这里列举出前5个

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

1.2、删除指定大文件的提交记录

并不是全部删除所有的大文件,你要确认这个大文件是没用的,然后再指定删除,例如大文件的名字叫dawenjian.zip,命令就是下面这个

git filter-branch -f --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch dawenjian.zip' --tag-name-filter cat -- --all

1.3、清理缓存

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

1.4、强制提交(有风险)

因为要用本地修改过的记录去覆盖,所以需要强制提交本地修改

git push origin --force --all

gitlab中,master默认是保护的分支,可能强制提交会报错protected之类的,这样需要先去后台把protected的分支关闭掉保护,然后再强制提交

二、使用工具

工具就是别人封装过的bfg-repo-cleaner,官网地址:https://rtyley.github.io/bfg-repo-cleaner/

依赖于java运行环境,如果未按照java的运行环境,需要先安装,然后将该脚本下载到本地,修改文件名为bfg.jar,命令行里面的bfg.jar都要带路径的。首先进入的仓库

cd some-big-repo.git

2.1、找出提交过的大文件,这里列举出前5个

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

也可以使用该工具自带的命令行,例如查找100M以上的文件

java -jar /Users/damon/Downloads/bfg.jar --strip-blobs-bigger-than 100M

2.2、删除指定大文件的提交记录

并不是全部删除所有的大文件,你要确认这个大文件是没用的,然后再指定删除,例如大文件的名字叫dawenjian.zip,命令就是下面这个

java -jar /Users/damon/Downloads/bfg.jar --delete-files dawenjian.zip hcses-warehouse.git --no-blob-protection

2.3、清理缓存

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

2.4、强制提交(有风险)

因为要用本地修改过的记录去覆盖,所以需要强制提交本地修改

git push origin --force --all

gitlab中,master默认是保护的分支,可能强制提交会报错protected之类的,这样需要先去后台把protected的分支关闭掉保护,然后再强制提交

三、结束

如果操作一个分支没反应,可以试试切换不同的分支全部来一波。操作之前提前备份哦~

参考链接


☟☟可点击下方广告支持一下☟☟

最后修改:2021 年 01 月 07 日
请我喝杯可乐,请随意打赏: ☞已打赏列表