背景:
话说有一天clone某个项目代码时,进展迟迟,仔细一看项目仓库的大小达到了3.2G,项目也没有多大,怎么会有这么多代码?经过了解原来是有位小伙伴误将一些不需要添加到仓库的外部资源文件,提交到了项目仓库中,虽说后来发现问题,删除那些文件,但是项目确并没有降下来,才有了这么一个结果。
step1: 查找资料
这个事以前没有发生过,自然也就没处理过,还是先找找资料,看看别人是怎么处理的吧,经过度娘多方查找,别说还真有不少相关的资料,也就是说范过这样错误,或误操作的人还是真有一少,经过查阅对比,觉得https://www.cnblogs.com/zooqkl/p/10417186.html,些篇文章的介绍的比较仔细,可操作性也比较好,就以它为起点,给仓库clone了一个备份后,就开如干。
step2: 查找要彻底从仓库中移除的文件
参考的博文提供了如下方法: 通过按文件大小排序的方式来找到要删除的文件
$ git verify-pack -v .git/objects/pack/pack-43035f03d78ed39da647d4685e427bd126209bdb.idx | sort -k 3 -n | tail -10
e28b267b24de7d5b32ed2391669df8a72e24257d blob 162449408 62757122 757958127
c32c8b1da1c6283b250402aa31cde35051a52b3d blob 177733120 59785053 1360726301
711c9b581771981c54b4637497ceeb4bb23012bd blob 188976128 70107988 2347396900
d5cb26ac04328a255e922a24ea271ee50901c59d blob 196414976 74351707 1500585499
f93b48272597886796fc03d54e281f2403bea5ed blob 199080448 44716221 1455869278
247b35b36ef4c9f980c8cf967712788539980e5d blob 244180480 88897974 820715249
71848a6b5cb31639f8770553ddf6222573755d3d blob 414519296 140712921 100780869
d69f7af4727d15ee563aead6eff1d8baff61105d blob 1295518720 427812890 330145237
a3a36f25a9c3d610cb4d4eea381314ecf7b1510d blob 1324011520 443360428 909613223
c32670dfb49ae6a5948517fb6d19f78812a840ad blob 1802148352 617108853 1730288047
通过上面的指令来找到最大的前10个文件对象
git rev-list --objects --all | grep e28b267b24de7d5b32ed2391669
e28b267b24de7d5b32ed2391669df8a72e24257d backEnd/vendor/history/dockerimages/fabric-baseos
通过文件对象找到这个文件的所在路径,目录也是一样的。
git log --pretty=oneline --branches -- backEnd/vendor/history/dockerimages/fabric-baseos
486eac3085e25e9cec8c2de35c1e09cf79a5134e update
5fb74121be3fe311428068dd02837406a5d8f173 update
1380ead7f038a4b23add4fd64e9b66cb678cd6b5 commit something
a49db09fb148aabf51223d73fbcdb71e103610a0 update
722113f8a88e03cafebe7bbfcb6de20ffb068387 push
通过这一步或以追溯文件的提交路径。
我遇到的情况不一样,我这边相对明确,知道是小伙伴误提交了文件,又删除的文件,我直截上gitlab中找到了提交记录,确认个目录的文件是误提交的,这样就直截找到了要删队的目标文件。
step3: 从仓库中清除误提交的文件历史记录
$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch backEnd/vendor/ILIOS/dockerimages/fabric-baseos' --prune-empty --tag-name-filter cat -- --all
Rewrite 6aeecaec3cfb419313bfb5516048b0979a6f284f (236/251) (11 seconds passed, rRewrite 2e5b34a51afb5a43f6b5d3e4400bfa0400629a4e (236/251) (11 seconds passed, rRewrite 914c89a1ea1e325f8be990c47cb71eaf88c29649 (236/251) (11 seconds passed, remaining 0 predicted)
WARNING: Ref 'refs/heads/branch1' is unchanged
WARNING: Ref 'refs/heads/master' is unchanged
Ref 'refs/heads/branch2' was rewritten
WARNING: Ref 'refs/remotes/origin/master' is unchanged
WARNING: Ref 'refs/remotes/origin/branch1' is unchanged
WARNING: Ref 'refs/remotes/origin/master' is unchanged
Ref 'refs/remotes/origin/branch2' was rewritten
通过这一步来清理文件的历记录,这样会彻底从仓库中清除该文件,如果处理的是目录,记得在 rm后面加上 -r 参数。
通过这一步以后,文件删除,但是你会发现整个仓库的大小并没有明确的变化,不要着急,我们接着进行下一步
setp4: 回收仓库空间
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now
git count-objects -v
更新文件引用,回收仓库空间,这会再看仓库是不是变小了,你的变没变小我不知道,但我的确实发生了变化,由原来的3.2G回收后变为了215M,从此感觉身轻气爽。
setp5:将创库推到远程服务器
git push origin --force --all
在这一步之前一定要通用使用这个仓库的小伙伴们,把原来clone下来的仓库删除了,待你为仓库瘦身完成推送到远程仓库后再重新去clone,否他们一推送又会把好容易减肥成功的身材一下又回到了解放前,查看./git/objects/pack/下的文件,变成了双份,一份是减肥前的,一份是减肥后的,别问我是怎么知道的。