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

科技资讯 投稿 7700 0 评论

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

大家好,我是小富~

前言

2000Star 的Github仓库上,居然发现有5个Issues,最近的一条日期已经是2022/8/1了,以前我还真没留意过这些,我这人懒得很,本地代码提交成功基本就不管了。

https://github.com/chengxy-nds/Springboot-Notebook

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

我不信

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 校验和。

瘦身利器

尽管我们知道了大文件的位置,可具体该删除哪些文件无从下手啊,objects目录下都是些压缩文件,弄不好整个仓库都得报废。

Issues的兄弟还给推荐了个Git仓库瘦身的工具,该说不说真的贴心啊。

BFG Repo-Cleaner,可以帮助我们筛选、清理大文件对象,官方文档地址:https://rtyley.github.io/bfg-repo-cleaner,接下来看看这工具咋用。

注意:在做以下操作之前,一定要备份! 一定要备份! 一定要备份!

1、下载安装

JDK8+ 的环境,并下载 BFG 的Jar包。

$ wget https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar

2、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 回收垃圾

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文件的大小。

彻底一点

快速的下载并成功运行才是他们在乎的,谁又会在意提交记录。那我干脆彻底一点,清理掉仓库的所有提交记录,一劳永逸。

我们首先使用 --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 LFS来管理大文件,千万不要像我这么操作,毕竟随意删除提交历史记录,在哪个公司都是不合规的。

重点感谢下提出建议的大兄弟

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

赞同 (41) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽