查看原文
其他

如何控制 Git 库的膨胀?一步搞定!

码云Gitee Gitee 2021-05-26

Git 小故事

相信每个公司都有自己的官网。小明公司也不例外,不过小明却发现公司的“猿”哥哥将许多视频放在了代码仓库里,导致原本只有代码的仓库从早期的几十MB,飙升至 1G以上,变得无比臃肿(或者是慢慢臃肿)。这时老板大手一挥删了所有视频,理论上是该缩小的,但小明发现仓库体积并没有变化。明明删了视频,怎么仓库竟没有减小?


到底发生了什么导致 Git 库的膨胀?



根据 Git 的数据存储机制,只要通过命令 git add 将文件存储至暂存区,都会对版本库中的每一个文件,不论是图片、视频、源文件还是二进制文件生成相对应的 Blob 对象(即一段二进制数据)。

如果你的项目中不小心打包进来了比较大的 word 文档或视频资源,Git 本身又识别不了该类型文件,只能当作二进制文件全量存储。所以,在其他人拉取该 word 文档更新完后再推远程分支的时候,则会使得 .git 下面的 objects 的文件夹大小迅速膨胀。

上面使用场景中表面删除了500M空间,实则增加了一次至少500M的历史提交记录,仓库容量并没有变化。


如何精简你的 Git 仓库?



1

压缩 Git 仓库


例如,码云项目管理中会提供存储库 GC 功能,用于清理悬空文件,压缩存储库对象,减少存储库磁盘占用。


2

删除大文件提交记录

查看存储库中的大文件:

git rev-list --objects --all | grep -E `git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}' | sed ':a;N;$!ba;s/\n/|/g'`

改写历史,去除大文件

git filter-branch --tree-filter 'rm -f path/to/large/files' --tag-name-filter cat -- --all
git push origin --tags --force
git push origin --all --force

并告知所有组员,push 代码前需要 pull rebase,而不是 merge,否则会从该组员的本地仓库再次引入到远程库中。

/

REVIEW

往期精彩


想快速上手 Spring Boot?看这些教程就够了! | 码云周刊第 81 期

码云让你轻松实现微信小程序版本控制,多人开发更简单!

程序员定制信用卡,享受码云专属权益

初创企业限时特惠,999 即可购买码云标准版

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存