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 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

Redis 客户端缓冲区 output buffer

output buffer是 Redis 为 client 分配的缓冲区,Redis的每个连接都配有自己的缓冲区空间 这个client包括: (1)真正的用...

35215
来自专栏向治洪

ngnix服务器搭建

 1.  到nginx官网上下载相应的安装包,http://nginx.org/en/download.html;下载进行解压,将解压后的文件放到自己心仪的目...

2009
来自专栏Java工程师日常干货

玩转Redis集群(下)Redis集群操作实践Redis实现Session共享Java操作Redis与Spring整合

从上面的操作,你可以看到,当存储某一个数据的时候,会分配一个slot,而这个slot从属于某一个Master,也就是说你需要明白,数据是分布的存储在Redis集...

601
来自专栏程序之美

第一节 netty概述

452
来自专栏烂笔头

Django 1.10中文文档-第一个应用Part6-静态文件

目录[-] 本教程上接Part5 。前面已经建立一个网页投票应用并且测试通过,现在主要讲述如何添加样式表和图片。 除由服务器生成的HTML文件外,网页应用一...

2897
来自专栏游戏杂谈

Flash Builder 4安装SVN插件

flash builder与eclipse类似,装插件的方法也差不多。唯一要注意的时候是选择包的问题,如下图所示:

773
来自专栏张伟博客

SVN的备份及恢复

944
来自专栏技术博文

线程,进程和并发

进程 进程是什么?进程是正在执行的程序;进程是正在计算机上执行的程序实例;进程是能分配给处理器并由处理器执行的实体。 进程一般会包括指令集和系统资源集,这里的指...

2997
来自专栏Echo is learning

centos 问题解决记录

1101
来自专栏pangguoming

CentOS怎样查看系统信息

一、查看系统版本和核心版本 1 登陆CentOS,启动终端。 ? 2 登陆root帐户,输入 cat  /etc/redhat-relea...

3014

扫码关注云+社区