Git的gc功能

Git的底层并没有采用 CVS、SVN 底层所采用的那套增量式文件系统,而是采用一套自行维护的存储文件系统。当文件变动发生提交时,该文件系统存储的不是文件的差异信息,而是文件快照,即整个文件内容,并保存指向快照的索引。这种做法,提高 Git 分支的使用效率;但也容易导致代码仓库中内容重复程度过高,从而仓库体积过大。当遇到这种情况时,或者需要将仓库推送到远程主机时,就需要Git中的gc(garbage collect)功能,也就是垃圾回收功能。

大体来说,当运行 "git gc" 命令时,Git会收集所有松散对象并将它们存入 packfile,合并这些 packfile 进一个大的 packfile,然后将不被任何 commit 引用并且已存在一段时间 (数月) 的对象删除。 此外,Git还会将所有引用 (references) 并入一个单独文件。

就细节而言,Git做了这几件事:

  • pack_refs 过程
  • reflog expire 过程
  • repack 过程
  • prune 过程
  • rerere 过程

pack_refs 过程相当于执行"git pack-refs --all --prune",它会将$GIT_DIR/refs目录下的所有heads和tags打包成一个文件并保存为$GIT_DIR/packed-refs下。

reflog expire 过程相当于执行"git reflog expire --all",它会将删除所有超过期限而且没有被refs涉及的reflog条目。

repack 过程相当于执行"git repack -d -l",一般情况下还会包括"-A"选项,它会将所有未被包含在一个pack的松散对象连结成一个pack,也会将现有的pack重新组织为一个新的更有效率的pack,并删除冗余的pack(如果她们中存在不可达的松散对象,会先把这些对象释放出来)。

prune 过程相当于执行"git prune --expire",他会删除所有过期的、不可达的且未被打包的松散对象。

rerere 过程相当于执行"git rerere gc",这种情形下似乎没什么用。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏代码GG之家

android native内存检测方案(二)

android native 代码内存泄露 定位方案(一) 什么是 AddressSanitizer clang 是一个 C、C++、Objective-C 编...

31610
来自专栏CodeSheep的技术分享

Pipeline As Code With Jenkins2.0

3089
来自专栏康怀帅的专栏

CoreOS 容器 Rkt 简单介绍

由于 Docker 已经成为事实上的容器老大,这里暂且将 rkt 内容放入 docker 文件夹。哈哈 官方网站:https://coreos.com/rkt/...

3797
来自专栏码神联盟

Spring Boot 之Application.properties配置大全

前几期,我们讲到了Spring Boot的框架,动手操作过的人,应该都还记得,并且觉得确实简化了很多,那么对于其中application.properties的...

1K7
来自专栏生信宝典

查看服务器配置信息

学习Linux命令,我们需要有一台Linux服务器。有了服务器,就想看看它的性能怎样。翻出自己较早前写的一个脚本,一键查看系统大部分参数。 This is an...

19210
来自专栏惨绿少年

磁盘管理 之 parted命令添加swap,文件系统

第1章 磁盘管理 1.1 必须要了解的。 1.1.1 ps aux 命令中 RSS 与VSZ的含义 rss 进程占用的物理内存的大小 单位:kb ;   ...

2130
来自专栏博客园

StackExchange.Redis 使用-配置 (四)

Configuration redis有很多不同的方法来配置连接字符串 , StackExchange.Redis 提供了一个丰富的配置模型,当调用Conne...

603
来自专栏我的博客

Vagrant挂载目录失败mount: unknown filesystem type ‘vboxsf’

错误提示: Vagrant was unable to mount VirtualBox shared folders. This is usually bec...

4238
来自专栏Python小屋

Python监视进程创建情况和系统服务状态

(1)监视Windows系统中进程创建情况 import wmi c = wmi.WMI() process_watcher = c.Win32_Proce...

2686
来自专栏沃趣科技

ASM 翻译系列第十二弹:ASM Internal amdu - ASM Metadata Dump Utility

原作者:Bane Radulovic 译者: 庄培培 审核: 魏兴华 DBGeeK社群联合出品 amdu - ASM Metadata Dump U...

3495

扫描关注云+社区