被吐槽 GitHub仓 库太大,直接 600M 瘦身到 6M,这下舒服了
大家好,我是小富~
前言
忙里偷闲学习了点技术写了点demo代码,打算提交到我那 2000Star 的Github仓库上,居然发现有5个Issues
,最近的一条日期已经是2022/8/1了,以前我还真没留意过这些,我这人懒得很,本地代码提交成功基本就不管了。
5个Issues
中,有个标题"优化本仓库大小的建议"吸引我了,赶紧点进去看看啥情况,这个哥们说我这个仓库太大了,仓库700多M,半天也拉不下来,然后还给我附上了修改建议(不要太贴心哦)。
我不信
开始我还有点不信,这仓库提交的是我平时写文章中跑的代码demo,每个项目也就十来个文件几十KB,怎么会有700M这么多,不信邪的我赶紧看了下仓库大小Setting->Repositoriess
,居然真有683M这么多。
于是我赶紧Clone
仓库到本地,看看是不是我提交了什么大文件,下载过程确实挺折磨人,不仅慢还经常中断,在经过不知道多少次重试之后,终于下载下来了。
翻了翻各个项目发现里边的确有许多应该忽略的文件.idea
、.mvn
、target
都被我提交了,直接删除文件,但并没有什么卵用,项目整体size
变化不大,应该不是这些文件的原因。
我用du
命令看了下各目录的文件大小,发现./springboot-seata-transaction
目录45M,因为里边有一个jar直接删除就行了;而 .git
足足有688M,看来问题就出在这个目录,重点优化下。
这目录好大
那么.git
目录是存放什么的?为什么会这么大呢?
在Git
系统中,.git目录中存储了整个代码仓库的元数据信息(包括提交历史记录、分支、标签等)和文件对象。
我在该目录上用du
命令看了一下,发现 objects 目录居然有683M,那么问题就是出在它身上了。
objects
目录之所以这么大,是因为它保存了仓库中的所有历史版本和数据对象,也就是blobs
文件内容, trees
目录结构, commits
提交历史,它们是 Git 中的三个核心对象类型。
其中:
Blobs: 每一个文件都被视为一个二进制对象(Blob 对象),它保存了文件的所有内容和一些元数据信息,如文件名、文件类型、文件大小等。当文件发生变化时,Git 会自动计算并存储新的 Blob 对象,并将其与先前的 Blob 对象做比较,以确定文件的变化情况。
Trees: 目录也被视为一个对象(Tree 对象),它保存了目录中包含的所有文件和子目录的列表,每个列表项包括了文件或目录的名称、类型、权限等信息,以及对应文件或目录的 Blob 或 Tree 对象的 SHA 校验和。
Commits: 我们每次提交代码,就会产生一次Commit, Commit对象保存了一次代码变更的相关信息,包括作者、提交时间、父提交记录的 SHA 值、描述信息等。每个 Commit 对象还包含指向对应代码快照的 Tree 对象的 SHA 校验和。
上边三种类型的对象组成了Git中的基本数据单元,通过这些对象的组合和链接,才构建出完整的提交历史,并跟踪代码库中每个文件的变化历史。这个目录是Git中最重要的目录之一,所以对它操作要谨慎,不然很容易丢失历史记录。
瘦身利器
尽管我们知道了大文件的位置,可具体该删除哪些文件无从下手啊,objects
目录下都是些压缩文件,弄不好整个仓库都得报废。
好在提Issues
的兄弟还给推荐了个Git仓库瘦身的工具,该说不说真的贴心啊。
这个Git仓库清理工具叫BFG Repo-Cleaner
,可以帮助我们筛选、清理大文件对象,官方文档地址:https://rtyley.github.io/bfg-repo-cleaner ,接下来看看这工具咋用。
注意:在做以下操作之前,一定要备份!!! 一定要备份!!! 一定要备份!!!
1、下载安装
BFG 是以java -jar的方式启动,首先安装不低于JDK8+ 的环境,并下载 BFG 的Jar
包。
$ wget https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar
2、clone 仓库
在 clone 仓库的时候推荐使用--mirror
参数,将源仓库的所有分支、标签以及提交历史都完整地克隆到本地,只会拉取.git
目录的相关文件。
$ git clone --mirror git://example.com/Springboot-Notebook.git
3、查找大文件
将 bfg-1.14.0.jar
和 Springboot-Notebook.git
放在同一级目录下,执行下边的命令过滤出大于20M的文件对象。
# 查找出大于20M的需要清理的文件
$ java -jar bfg-1.14.0.jar --strip-blobs-bigger-than 20M Springboot-Notebook.git
看到过滤出了很多大文件,包含了Issues
中兄弟提到的那个Jar包。
4、删除大文件
使用--delete-files
命令逐一的将大文件删除,如果提示分支是被保护的可以加上--no-blob-protection
命令执行。
# 查找出大于20M的需要清理的文件
$ java -jar bfg.jar --delete-files Cyrillic.traineddata Springboot-Notebook.git
5、GC 回收垃圾
上边我们虽然过滤、删除了大文件,此时仓库的大小仍然没有变化,进入Springboot-Notebook.git仓库内,执行 git reflog expire
和 git gc
命令,压缩 Git 库中的历史版本、清除废弃的、过期的对象,这个过程会耗费较长的时间。
# 进入目录
$ cd Springboot-Notebook.git
# 执行git gc 回收垃圾
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
# 推送
$ git push
最后推送代码到远程仓库,在看仓库的大小已经降到了108M,效果挺显著,剩下的108M应该就是我频繁提交导致的了,查了下我居然有127次提交之多。
每次提交都会生成一次快照,这些快照可能包含大量的文件和代码,频繁提交会导致版本库中快照的数量增加。Git使用的是一种增量存储方式,每次提交只存储发生了变化的文件和代码。
但是,如果频繁提交的变化较小,比如只是修改了几个字符或者行末空格,Git可能无法正确地检测出这些变化,而将整个文件都存储起来,也会增加了.git文件的大小。
彻底一点
后来我想了想这个仓库存在的意义,不就是让大家看着文章跑demo代码嘛,能快速的下载并成功运行才是他们在乎的,谁又会在意提交记录。那我干脆彻底一点,清理掉仓库的所有提交记录,一劳永逸。
那么操作起来就得小心一点了,毕竟2000star,别把仓库弄嘎了,既要清除一个分支上的所有提交记录,同时又不能删除这个分支本身,其实我们可以迂回一下。
我们首先使用 --orphan
命令创建一个全新的分支new-branch
,这个新建的分支和其他分支没有任何关系,它不会包含任何先前的提交记录或者历史记录。相当于新建了一个干净的空分支,并让该分支指向一个全新的根节点。
git checkout --orphan <new-branch-name>
然后 commit 全部的项目文件到这个分支,暂不需要推到远程仓库。
git add -A
git commit -am "Initial commit"
接着删除旧的分支,并把新建的分支名改成旧分支名称,推到远程仓库就行了。
#
git branch -D <old-branch-name>
git branch -m <old-branch-name>
git push -f origin <old-branch-name>
在推完代码后我再次去看了下仓库的大小,现在就只有6.33M了,如果不是人脸识别项目中有几个必要的SDK包,应该还能在小点。
总结
以我自己的亲身经历做为反面教材,提醒大家操作Git要谨慎,工作中严禁提交该忽略的文件;提交代码要控制节奏,不能随心所欲,尤其是团队协作开发;如果发现.git
文件太大,推荐使用Git LFS
来管理大文件,千万不要像我这么操作,毕竟随意删除提交历史记录,在哪个公司都是不合规的。
重点感谢下提出建议的大兄弟
被吐槽 GitHub仓 库太大,直接 600M 瘦身到 6M,这下舒服了的更多相关文章
- 【SQLite】SQLite文件突然变大怎么办?瘦身办法
使用VACUUM命令即可: VACUUM 命令通过复制主数据库中的内容到一个临时数据库文件,然后清空主数据库,并从副本中重新载入原始的数据库文件.这消除了空闲页,把表中的数据排列为连续的,另外会清理数 ...
- 【福利大放送】不止是Android,Github超高影响力开源大放送,学习开发必备教科书
一.写在前面 最近项目重构,时间贼多,也没什么时间更新博客,个人的开源项目也是多时没有更新了:github地址,然而没有更新不代表我不在乎,后面一有空还是会继续提交的. 还是来冒个泡,给大家献上一些福 ...
- 部署的docker image总是太大,怎么办?
sudo docker images REPOSITORY TAG IMAGE ID CREATED ...
- 【转】福利大放送--不止是Android,Github超高影响力开源大放送,学习开发必备教科书
[福利大放送]不止是Android,Github超高影响力开源大放送,学习开发必备教科书 目录 一.写在前面 1.free-programming-books 2.oh-my-zsh 3.awes ...
- Sqlserver2005日志文件太大,使其减小的方法
Sqlserver2005日志文件太大,使其减小的方法: 运行下面的三行 dbName为数据库名: backup log dbNamewith NO_LOG backup log dbNamewith ...
- ORACLE 监听日志文件太大停止写监听日志引起数据库连接不上问题
生产库监听日志文件太大(达到4G多),发现oracle停止写监听日志,检查参数log_file,log_directory,log_status 均正常,数据库运行也正常. 经确认确实为监听日志过大引 ...
- Unity3D占用内存太大的解决方法
原地址:http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大 ...
- Sqlserver数据库日志太大如何快速删除
sqlserver使用在windows系统中,如果文件超上百GB了,我们还直接删除不了,这个问题我以前的apache日志就碰到过,至今还没删除呢,那么Sqlserver数据库日志太大如何快速删除呢,有 ...
- (转)Unity3D占用内存太大的解决方法
自:http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. ...
- Mysql History list length 值太大引起的问题
1. 环境 Mysql 主从 Mysql版本:5.1.49-log 系统:Red Hat Enterprise Linux Server release 5.4 64bit 2. 表面现象 数据库操 ...
随机推荐
- upload 上传文件
func SaveUploadedFile(file *multipart.FileHeader, dst string) error{ src, err := file.Open() if err ...
- C语言II—作业03
1.作业头 这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/SE2020-3 这个作业要求在哪里 https://edu.cnblogs.com/cam ...
- 8css 盒子模型
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【Unity】Timeline探索记(4)第二个例子——动作特写/子弹时间
写在前面 这次例子参考这篇实现博文(附带项目下载),博文前面介绍非常具体,可惜后面特写轨实现代码不是按照我想要的标准四大件(data.mixer.clip.track)来组织的,所以这里我略过介绍,只 ...
- [C++] Linux TCP Socket 实例- 阻塞
Linux平台 TCP Socket通信实例,发现用代码注释记笔记也不错 TCP server 阻塞 1 // 两个进程通过socket进行通信,client需要知道server的,server却不需 ...
- Mxgraph
1. Hello World! Creating an HTML page that links the mxGraph client JavaScript, Creating a container ...
- VisualVM无法运行,修改配置文件
在VisualVM安装位置下找到etc目录修改etc目录下的visualvm.conf文件 加入配置 参数 指定JDK或JRE路径,如 visualvm_jdkhome="C:\xxx\ ...
- vs2019远程调试win7系统的程序
vs2019远程调试 一.安装vs2019远程调试工具 首先让调试的电脑(也就是不安装vs2019的电脑),安装vs2019远程调试工具:VS_RemoteTools.exe. 网址:进行下载.h ...
- Linux下apache日志(按日期存放)分析与状态查看方法
转载网址: https://blog.csdn.net/weixin_42272246/article/details/125602258
- Cesium 后处理(Post Process)
原文地址:https://blog.csdn.net/ls870061011/article/details/123910821 作者:GIS李胜 为实现三维模型的更炫.更酷.更美观,Cesium在1 ...