清除git仓库中的误提交的大文件和无用目录的历史记录

背景:

话说有一天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/下的文件,变成了双份,一份是减肥前的,一份是减肥后的,别问我是怎么知道的。

 

转载于:https://my.oschina.net/janl/blog/3089963

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值