git删除版本库中大文件记录

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
CONTENTS