git删除版本库中大文件记录
一、场景
现在有这样一种情况,我不小心往git库上传了一个很大的文件,如xxxx.tar.gz
,我删除后,提交推送,文件没有了,但在git的版本库中还是存在,使.git
目录特别大,可以通过以下几个命令轻松搞定。
二、实例:
我的spring-cloud学习的仓库github地址: spring-cloud-example 先看看目录文件大小:
$ du -d 1 -h
23M ./.git
32K ./cloud-api-gateway
20K ./cloud-config-server
32K ./cloud-data-mysql
28K ./cloud-eureka-server
36K ./cloud-service-ext
32K ./cloud-trade-service
20K ./cloud-user-api
60K ./cloud-user-service
20K ./cloud-zipkin-ui
24K ./config-repo
1.5M ./doc
20K ./cloud-admin-ui
20K ./cloud-turbine-dashboard
388K ./cloud-comx
80K ./bs-common-exception
25M .
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}')"
79a60cf86e4953b296e62da88fee1cfa8ce20a66 cloud-swagger/src/main/webapp/api/dist/swagger-ui.js
a3a34487421247549f944d017ef480ce7d4be537 cloud-swagger/src/main/webapp/dist/91baf32caa045b74d22e.worker.js.map
8aad956353bf4d3b5363d36f2766bf01ca961fda cloud-swagger/src/main/webapp/dist/bundle.js
49d3c113e1983e7bc3e0fdefa99793d34e5ee9c6 cloud-swagger/src/main/webapp/dist/bundle.js.map
ab9148b0a5b882c6f57b0ab97e7c93125058f155 cloud-swagger/src/main/webapp/dist/styles.css
可以看出,我上传的cloud-swagger
已经被删除,但还在版本库中占空间。
2. 记录大文件
把上面几个文件名保证到一个文件如log.txt
:
$ cat log.txt
cloud-swagger/src/main/webapp/api/dist/swagger-ui.js cloud-swagger/src/main/webapp/dist/91baf32caa045b74d22e.worker.js.map cloud-swagger/src/main/webapp/dist/bundle.js cloud-swagger/src/main/webapp/dist/bundle.js.map cloud-swagger/src/main/webapp/dist/styles.css
3.重写commit,删除大文件
git filter-branch -f --prune-empty --index-filter "git rm -rf --cached --ignore-unmatch `cat log.txt`" --tag-name-filter cat -- --all
4. 清理和回收空间
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
清理后再看,发现.git目录从23M变成了3.6M
5. 强行推送到仓库
git push origin master --force