被吐槽 GitHub仓 库太大,直接 600M 瘦身到 6M,这下舒服了

前言

忙里偷闲学习了点技术写了点demo代码,打算提交到我那 2000Star 的Github仓库上,居然发现有5个Issues,最近的一条日期已经是2022/8/1了,以前我还真没留意过这些,我这人懒得很,本地代码提交成功基本就不管了。

仓库地址:https://github.com/chengxy-nds/Springboot-Notebook

5个Issues中,有个标题"优化本仓库大小的建议"吸引我了,赶紧点进去看看啥情况,这个哥们说我这个仓库太大了,仓库700多M,半天也拉不下来,然后还给我附上了修改建议(不要太贴心哦)。

我不信

开始我还有点不信,这仓库提交的是我平时写文章中跑的代码demo,每个项目也就十来个文件几十KB,怎么会有700M这么多,不信邪的我赶紧看了下仓库大小Setting->Repositoriess,居然真有683M这么多。

于是我赶紧Clone仓库到本地,看看是不是我提交了什么大文件,下载过程确实挺折磨人,不仅慢还经常中断,在经过不知道多少次重试之后,终于下载下来了。

翻了翻各个项目发现里边的确有许多应该忽略的文件.idea.mvntarget都被我提交了,直接删除文件,但并没有什么卵用,项目整体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来管理大文件,千万不要像我这么操作,毕竟随意删除提交历史记录,在哪个公司都是不合规的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/34705.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python dict keys方法:获取字典中键的序列【将keys转为list】

描述 dict.keys()方法是Python的字典方法&#xff0c;它将字典中的所有键组成一个可迭代序列并返回。 使用示例 >>> list({Chinasoft:China, Microsoft:USA}.keys()) [Chinasoft, Microsoft] >>> test_dict {Chinasoft:China, Microsoft:USA, Sony:Japan,…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 4 日论文合集)

文章目录 一、检测相关(15篇)1.1 Artifacts Mapping: Multi-Modal Semantic Mapping for Object Detection and 3D Localization1.2 Shi-NeSS: Detecting Good and Stable Keypoints with a Neural Stability Score1.3 HODINet: High-Order Discrepant Interaction Network for…

机器学习一:线性回归

1 知识预警 1.1 线性代数 ( A T ) T A (A^\mathrm{T})^\mathrm{T}A (AT)TA$ ( A B ) T A T B T (AB)^\mathrm{T}A^\mathrm{T}B^\mathrm{T} (AB)TATBT ( λ A ) T λ A T (\lambda A)^\mathrm{T}\lambda A^\mathrm{T} (λA)TλAT ( A B ) T B T A T (AB)^\mathrm{T}B^…

【算法与数据结构】28、LeetCode实现strStr函数

文章目录 一、题目二、暴力穷解法三、KMP算法四、Sunday算法五、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、暴力穷解法 思路分析&#xff1a;首先判断字符串是否合法&#xff0c;然后利用for循环&#xff…

2023年全国节能宣传“节能低碳,你我同行”主题有奖竞答

2023年的7月10日至16日是第33个全国节能宣传周&#xff0c;主题是“节能降碳&#xff0c;你我同行”。 为践行低碳生活&#xff0c;切实做到节能降碳&#xff0c;各大企事业单位纷纷举办“节能低碳&#xff0c;你我同行”主题2023年全国节能宣传有奖竞答。 有奖知识竞答活动方…

Prometheus实现自定义指标监控

1、Prometheus实现自定义指标监控 前面我们已经通过 PrometheusGrafana 实现了监控&#xff0c;可以在 Grafana 上看到对应的 SpringBoot 应用信息了&#xff0c; 通过这些信息我们可以对 SpringBoot 应用有更全面的监控。 但是如果我们需要对一些业务指标做监控&#xff0c;…

【AI实战】从零开始搭建中文 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B

【AI实战】从零开始搭建中文 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B 简介环境配置环境搭建依赖安装 代码及模型权重拉取拉取 Chinese-LLaMA-Alpaca拉取 llama-30b-hf 模型权重及代码拉取 chinese-llama-lora-33b 模型权重及代码 合并模型权重先转换 pth 类型的模型权重&…

只出现一次的数字

题目链接 只出现一次的数字 题目描述 注意点 1 < nums.length < 30000-30000 < nums[i] < 30000除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次 解答思路 最初想到使用一种数据结构将元素存储起来&#xff0c;但是空间复杂度为O(n)&#xff0…

【花雕】全国青少年机器人技术一级考试备考实操搭建手册6

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

大语言模型的百家齐放

基础语言模型 概念 基础语言模型是指只在大规模文本语料中进行了预训练的模型&#xff0c;未经过指令和下游任务微调、以及人类反馈等任何对齐优化。 如何理解 只包含纯粹的语言表示能力,没有指导性或特定目标。 只在大量无标注文本上进行无监督预训练,用于学习语言表示。 …

git 新建分支,切换分支,上传到远程分支

git 在使用的过程中&#xff0c;有的时候我们需要更换一个分支才存贮数据&#xff0c;作为版本的一个迭代或者是阶段性成果的一个里程碑。 如何来做操作呢&#xff1f; 在git中&#xff0c;可利用checkout命令转换分支&#xff0c;该命令的作用就是切换分支或恢复工作树文件&a…

【微信小程序开发】第 9 课 - 小程序的协同工作和发布

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、协同工作 1.1、了解权限管理需求 1.2、了解项目成员的组织结构 1.3、小程序的开发流程 2、小程序成员管理 2.1、成员管…

Nftables栈溢出漏洞(CVE-2022-1015)复现

背景介绍 Nftables Nftables 是一个基于内核的包过滤框架&#xff0c;用于 Linux 操作系统中的网络安全和防火墙功能。nftables 的设计目标是提供一种更简单、更灵活和更高效的方式来管理网络数据包的流量。 钩子点&#xff08;Hook Point&#xff09; 钩子点的作用是拦截数…

DMDSC共享存储集群启动、关闭及介绍

DMDSC介绍 DM 共享存储数据库集群&#xff08;DMDSC&#xff09;。DM共享存储数据库集群&#xff0c;允许多个数据库实例同时访问、操作同一数据库&#xff0c;具有高可用、高性能、负载均衡等特性。DMDSC 支持故障自动切换和故障自动重加入&#xff0c;某一个数据库实例故障后…

使用GeoPandas进行地理空间数据可视化

大家好&#xff0c;在当今数据驱动的世界中&#xff0c;将信息可视化到地图上可以提供有价值的见解&#xff0c;帮助有效地传达复杂的模式。GeoPandas是一个建立在pandas和shapely之上的Python库&#xff0c;使用户能够通过将地理空间数据与各种变量合并来创建令人惊叹的地图。…

深度学习(23)——YOLO系列(2)

深度学习&#xff08;23&#xff09;——YOLO系列&#xff08;2&#xff09; 文章目录 深度学习&#xff08;23&#xff09;——YOLO系列&#xff08;2&#xff09;1. model2. dataset3. utils4. test/detect5. detect全过程 今天先写YOLO v3的代码&#xff0c;后面再出v5&…

C语言:猜凶手

题目&#xff1a; 日本某地发生了一件谋杀案&#xff0c;警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说&#xff1a;不是我。 B说&#xff1a;是C。 C说&#xff1a;是D。 D说&#xff1a;C在胡说 已知3个人说了真话&#xff0c;1个人说的是假话。…

2023,中国电商重回元老时代

中国的历史上不缺“太上皇”&#xff0c;但“太上皇”再度站到台前的很少。公元1457年&#xff0c;被囚禁在南宫的“太上皇”朱祁镇复位&#xff0c;上演了中国历史上少见的南宫复辟。而危机时刻被推举为皇帝的朱祁钰&#xff0c;后来的庙号是代宗&#xff0c;阴阳怪气十足。 …

Spark Sql 4/5

4. 用户自定义函数 通过spark.udf功能用户可以自定义函数。 4.1用户自定义UDF函数 Shellscala> val df spark.read.json("examples/src/main/resources/people.json")df: org.apache.spark.sql.DataFrame [age: bigint, name: string]​scala> df.show()--…

分布式运用——监控平台 Zabbix

分布式运用——监控平台 Zabbix 一、监控平台种类二、我们今天介绍Linux操作系统的传统监控平台——zabbix 6.0版本1.zabbix 是什么&#xff1f;2.**zabbix 监控原理&#xff1a;**3.Zabbix 6.0 新特性&#xff1a;4. Zabbix 6.0 功能组件&#xff1a;5.数据库6.Web 界面7.Zabb…