处理.git文件夹过大出现臃肿问题-filter-branch和BFG工具
Git开发手册
git一些不常用的命令记不住,可以查看git开发手册(https://m.php.cn/manual/view/34957.html)
1、.git/objects/pack 文件过大
今天从git拉取项目进行开发的时候克隆的很慢,还以为是网速的问题。查看了一些git命令框的拉取网络速度发现网速也很快,克隆下来后才发现是.git文件夹太大,项目代码占用很小。发现了是git的问题后,就第一时间查找下是那个地方出的问题导致文件过大。
进入.git目录后发现是/objects/pack目录下面的xxx.pack文件占用过大。
2、pack文件过大出现的原因
在开发过程中有时候不小心上传了大文件,虽然后面在目录里面删除了,但会被git记录下来。这样慢慢的记录的越来越多,就变为了目前这样文件太大。出现臃肿。我们可以使用git自带的filter-branch工具或者BFG进行仓库清理。
3、使用git filter-branch清理
进入git命令框,输入命令。首先查询出3个大文件信息
git verify-pack -v .git/objects/pack/pack-xxx.idx | sort -k 3 -n | tail -3 (xxx你的.git的pack目录文件)
查询结果
73671b13992abba02a7fa56d37735d4ac01803b1 blob 62992368 62936889 132214388
在根据上面的文件名的编码ID:73671b13992abba02a7fa56d37735d4ac01803b1 查询出大文件的名称:
git rev-list --objects --all | grep 73671b13992abba02a7fa56d37735d4ac01803b1
上面的为单个查询,我们也可以直接查询多个,把上面的两个命令合并一起执行。
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')" #查询前10个大文件
通过命令查询出文件信息,然后将该文件从历史记录的所有 tree 中移除,执行命令从历史中删除指定的大文:
git filter-branch --force --index-filter "git rm -rf --cached --ignore-unmatch 文件/文件夹" --prune-empty --tag-name-filter cat -- --all #文件/文件夹 是通过上面查询出来的大文件路径和名称
执行成功后需要删除和重建索引
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
然后设置历史记录的过期时间为现在,默认为90天。
git reflog expire --expire=now --all #所有未关联对象过期时间为现在
通过gc清理文件并优化本地存储库
git gc --aggressive --prune=now
强制提交
git push --all --force origin
执行完毕上面命令,一个大文件我们就清理完毕了,如果有多个大文件需要一个文件一个文件的执行。当大文件都清理完毕我们可以查看当前目录下个文件及目录占用空间大小
du -sh .git
如果输出文件过大,可以继续查找相关大文件进行删除。
git count-objects -v #计算解包的对象数量及其磁盘消耗量
4、高效大文件清理工具 BFG
官网地址:BFG (https://rtyley.github.io/bfg-repo-cleaner/ )BFG是git-filter-branch的替代品,官方介绍说要比 git-filter-branch 快上10~720x,本人使用了下,确实很快。值得我们去使用。需要去官网下载bfg.jar。也可以去镜像仓库下载(https://repo1.maven.org/maven2/com/madgag/bfg/)这里使用1.14.0版本。由于是jar包运行bfg需要具备java环境。简单介绍下命令,也可以自己去官网查找相关命令。
通过 --mirror 拉取自己项目的.git 文件, --mirror参数只拉取.git文件不克隆代码,防止操作失误修改项目代码。
git clone --mirrot xxx.git
查询前10个大文件
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')"
通过删除目录文件删除
java -jar bfg.jar --delete-folders {dev} --no-blob-protection project.git #{dev} 删除dev目录下面的所有文件
通过文件大小删除
java -jar bfg.jar --strip-blobs-bigger-than 10M project.git #删除文件大于10M
通过文件名字删除,先通过查询大文件查询出数据,然后通过文件名称执行该命令删除:
java -jar bfg.jar --delete-files "xxxx" project.git
java -jar bfg.jar --delete-files "xxxx" --no-blob-protection project.git
删除敏感信息
java -jar bfg.jar --replace-text pwd.txt project.git
pwd.txt自己定义需要移除数据的文本,具体语法自己可以查找相关文档。
设置过期时间为现在 & 清理文件
git reflog expire --expire=now --all && git gc --prune=now --aggressive
推送到远程
git push --mirror
最后我们在执行下 du -sh .git 命令查询一些.git文件夹大小,发现一些没有的文件我们已经清理干净了。后面需要重新从git克隆代码,不要使用之前的.git文件进行提交。否则文件会变得更大。
处理.git文件夹过大出现臃肿问题-filter-branch和BFG工具的更多相关文章
- .git文件夹太大问题及解决方法
最近我们做了自动化构建, 发现文件.git文件夹越来越大, 求后端小伙伴帮忙, 小伙伴指点了一下说周末弄了一下, 忘记命令的.大致的意思就是找到git 提交了哪些大文件. 然后重构git, 先分享给小 ...
- vs2010/2013项目的C++所在文件夹越来越大如何解决?
vs2010/2013项目所在文件夹越来越大如何解决? Tools->Options->Text Editor->C/C++->Advanced,在 Fallback Loca ...
- 从.git文件夹探析git实现原理
git是一款分布式代码版本管理工具,通过git能够更加高效地协同编程.了解git的工作原理将有助于我们使用git工具更好地管理项目.通过了解.git文件夹中的文件组成,我们可以从一个角度去窥探git的 ...
- DriverStore文件夹特别大,能删除吗?
DriverStore文件夹特别大,能删除吗? DriverStore\FileRepository文件夹特别大,能删除吗? C:\Windows\System32\DriverStore\FileR ...
- [转载]DriverStore文件夹特别大,能删除吗?
[转载]DriverStore文件夹特别大,能删除吗? 转自博客园https://www.cnblogs.com/lovebing/p/6951833.html 这篇文章,清理完C盘多了20G!不要太 ...
- 修改apache2配置,禁止目录访问+禁止访问.git文件夹
通过url访问服务器,无论是本地服务器还是远程服务器 如果你的文件根目录里有 index.html,index.php,浏览器就会显示 index.html的内容,如果没有 index.html,浏览 ...
- .svn文件夹特别大
一个项目通过svn管理,迭代开发一年之后,.svn目录达到20G或更大,对于SSD硬盘来说是非常占用空间的,经过我的尝试,可以使用tortoiseSVN自带的cleanup为文件夹瘦身. 操作方法: ...
- git文件夹下项目更改ip地址小结
在我们开发的过程中,经常切换项目IP地址是很正常的,之前弄过一次,没有记住,现在简单的总结下: 找到要切换IP地址的项目,点击鼠标右键,弹出下图: 打开该项目的路径后,双击打开该项目,具体参考自己项目 ...
- 整理自Git文件夹下资料及man手册(不包括书籍)
$ git commit -awhich will automatically notice any modified (but not new) files, add them to the ind ...
- 使用git push命令如何忽略不想提交的文件夹或者文件
如下场景是在window下的操作. 在使用node的时候有个node_modules文件夹很大,一般情况下不想提交,忽略的办法如: 方法一(来自评论区):直接在仓库根目录:执行命令echo 'node ...
随机推荐
- socket搭建web服务端
import socket from threading import Thread import time def html(conn): time_tag = str(time.time()) p ...
- [Asp.Net Core] 网站中的XSS跨站脚本攻击和防范
漏洞说明: 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往 ...
- STIL 格式pattern介绍
相信很多工程师,特别是刚入行或准备入行的兄弟们或多或少听过测试相关的东西.如果你想做DFT工程师的,测试工程师的,而对于设计/验证工程师们如果能了解下STIL文件的原理,在和DFT/测试工程师聊技术聊 ...
- Karmada 多云容器编排引擎支持多调度组,助力成本优化
摘要:Karmada 社区也在持续关注云成本的管理,在最近发布的 v1.5 版本中,支持用户在分发策略 PropagationPolicy/ClusterPropagationPolicy 中设置多个 ...
- Prisim Sample 7 Modules App.Config
在项目中添加模块化文件.模块文件怎样在主项目中注册.本例 说明方式一,使用了App.config文件. 其中: <?xml version="1.0" encoding=&q ...
- 音视频八股文(11)-- ffmpeg avio 内存输入和内存输出。内存输出有完整代码,网上很少有的。
1.avio介绍 avio是FFmpeg中的一个模块,用于实现多种输入输出方式的封装. avio提供了一系列API,可以将数据从内存读取到缓冲区中,也可以将缓冲区中的数据写入到内存中.其实现依赖于IO ...
- #Powerbi 利用视觉对象着色地图,制作数据地图
日常工作中,有时我们会遇到需要地图来展示我们的数据场景,利用POWERBI,我们可以快速的制作自己的业务地图. Powerbi自带了三大地图,今天我们用到的是形状地图. 步骤讲解: 第一步:下载对应的 ...
- 一种KV存储的GC优化实践
作者:vivo 互联网服务器团队- Yuan Jian Wei 从内部需求出发,我们基于TiKV设计了一款兼容Redis的KV存储.基于TiKV的数据存储机制,对于窗口数据的处理以及过期数据的GC问题 ...
- 2020-01-25:redis中,哨兵如何选举?
福哥答案2020-01-25: [答案1:](https://bbs.csdn.net/topics/398982967)redis-sentinel故障转移的流程:1.当多个sentinel发现并确 ...
- 越小越好: Q8-Chat,在英特尔至强 CPU 上体验高效的生成式 AI
大语言模型 (LLM) 正在席卷整个机器学习世界.得益于其 transformer 架构,LLM 拥有从大量非结构化数据 (如文本.图像.视频或音频) 中学习的不可思议的能力.它们在 多种任务类型 上 ...