git版本库瘦身

文章目录

    • git保存数据模式
    • 打包对象
    • 清理未关联的对象

git保存数据模式

Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方式。 从概念上来说,其它大部分系统以文件变更列表的方式存储信息,这类系统(CVS、Subversion、Perforce、Bazaar 等等) 将它们存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异 (它们通常称作 基于差异(delta-based) 的版本控制)。
Git 不按照以上方式对待或保存数据。反之,Git 更像是把数据看作是对小型文件系统的一系列快照。 在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。 为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。

从以上信息可知,git保存的是快照而不是差异,那么随着git提交次数增加,git版本库的体积会越来越大,好在git提供了一些命令可以解决这种问题。

打包对象

git数据大多保存在.git/objiects,我们每次保存数据都会增加新的快照,即使少量的改动,也会生成相应新的快照,虽然保存快照进行了压缩,但还是没有实现增量存储。
在这里插入图片描述
git gc对分散在.git/refs下的文件进行打包,打包到文件.git/packedrefs中。
git版本库瘦身_第1张图片
git verify-pack -v .git/objects/pack/pack-acccb266f218c2d6d642eee70acda5c952f6e88e.pack查看打包内容
git版本库瘦身_第2张图片

清理未关联的对象

一次提交中,可能使用了多次git add,只需把保存最后一次提交的文件即可,过程文件可以作为垃圾对象被清理掉。
git prune 删除未关联的对象
git prune -n查看执行git prune会删除的对象
git fsck查看未关联的垃圾对象
git reset回退的、已删除分支的对象不会被认为是未关联的对象,所以不会被清理,以下命令通过配置禁用宽限日期和reflog等配置参数可直接删除未关联的对象

git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0
-c gc.rerereresolved=0 -c gc.rerereunresolved=0
-c gc.pruneExpire=now gc “$@”

你可能感兴趣的:(git,git)