https://www.atlassian.com/git/tutorials/git-gc
https://www.atlassian.com/git/tutorials/git-gc
The git gc command is a repository maintenance command. The "gc" stands for garbage collection. Executing git gc is literally telling Git to clean up the mess it's made in the current repository. Garbage collection is a concept that originates from interpreted programming languages which do dynamic memory allocation. Garbage collection in interpreted languages is used to recover memory that has become inaccessible to the executing program.
Git repositories accumulate various types of garbage. One type of Git garbage is orphaned or inaccessible commits. Git commits can become inaccessible when performing history altering commands like git resets or git rebase. In an effort to preserve history and avoid data loss Git will not delete detached commits. A detached commit can still be checked out, cherry picked, and examined through the git log.
In addition to detached commit clean up, git gc will also perform compression on stored Git Objects, freeing up precious disk space. When Git identifies a group of similar objects it will compress them into a 'pack'. Packs are like zip files of Git bjects and live in the ./git/objects/pack directory within a repository.
What does git gc actually do?
Before execution, git gc first checks several git config values. These values will help clarify the rest of git gc responsibility.
git gc configuration
gc.reflogExpire
An optional variable that defaults to 90 days. It is used to set how long records in a branches reflog should be preserved.
gc.reflogExpireUnreachable
An optional variable that defaults to 30 days. It is used to set how long inaccessible reflog records should be preserved.
gc.aggressiveWindow
An optional variable that defaults to 250. It controls how much time is spent in the delta compression phase of object packing when git gc is executed with the --aggressive option.
gc.aggressiveDepth
Optional variable that defaults to 50. It controls the depth of compression git-repack uses during a git gc --aggresive execution
gc.pruneExpire
Optional variable that defaults to "2 weeks ago". It sets how long a inaccessible object will be preserved before pruning
gc.worktreePruneExpire
Optional variable that defaults to "3 months ago". It sets how long a stale working tree will be preserved before being deleted.
git gc execution
Behind the scenes git gc actually executes a bundle of other internal subcommands like git prune, git repack, git pack and git rerere.
The high-level responsibility of these commands is to identify any Git objects that are outside the threshold levels set from the git gc configuration.
Once identified, these objects are then compressed, or pruned accordingly.
git gc best practices and FAQS
Garbage collection is run automatically on several frequently used commands:
The frequency in which git gc should be manually executed corresponds to the activity level of a repository.
A repository with a single contributing developer will need to execute git gc far less often than a frequently-updated multi-user repository.
git gc vs git prune
git gc is a parent command and git prune is a child.
git gc will internally trigger git prune.
git prune is used to remove Git objects that have been deemed inaccessible by the git gc configuration.
Learn more about git prune.
What is git gc aggressive?
git gc can be invoked with the --aggressive command line option.
The --aggressive option causes git gc to spend more time on its optimization effort.
This causes git gc to run slower but will save more disk space after its completion.
The effects of --aggressive are persistent and only need to be run after a large volume of changes to a repository.
What is git gc auto?
The git gc --auto command variant first checks if any housekeeping is required on the repo before executing.
If it finds housekeeping is not needed it exits without doing any work.
Some Git commands implicitly run git gc --auto after execution to clean up any loose objects they have created.
Before execution git gc --auto will check the git configuration for threshold values on loose objects and packing compression size.
These values can be set with git config.
If the repository surpasses any of the housekeeping thresholds git gc --auto will be executed.
Getting started with git gc
You're probably already using git gc without noticing.
As discussed in the best practices section, it is automatically invoked through frequently used commands.
If you want to manually invoke it simply execute git gc and you should see an output indicating the work it has performed.
https://www.atlassian.com/git/tutorials/git-gc的更多相关文章
- git使用,Git的skil-map,git配置http/https/socks5代理
. 检出.克隆库: git clone git://git.openwrt.org/openwrt.git 2. git查看某个文件的修改历史 git log --pretty=oneline 文件名 ...
- 【git】git中使用https和ssh协议的区别以及它们的用法
git可以使用四种主要的协议来传输资料: 本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 git 协议.其中,本地协议由于目前大都是进行远程开发和共享代码所以一般不常 ...
- Git:Git初体验——Git安装配置
作为即将成为一个程序员的男人,一直在听别人说Git多好多好,之前也随便了解了一些,但是始终没有决心去学会.现在大四了,只有毕设和一门开学六七周只去过一次课的全员必修课外,也没有什么事情做,何不去做这些 ...
- git使用--git命令项目提交问题总结
提交遇到Error "remote ref does not exist"解决办法:git fetch -p MY_REMOTE eg. git fetch -p o ...
- Android Studio配置Git及Git文件状态说明
Android Studio配置Git还是比较简单的,麻烦的是可能中间出现各种问题.如果你想了解或感兴趣,请往下看. 首先你得下载Git客户端,网址:http://git-scm.com/downlo ...
- 真正理解 git fetch, git pull 以及 FETCH_HEAD【转】
转自:http://www.cnblogs.com/ToDoToTry/p/4095626.html 真正理解 git fetch, git pull 要讲清楚git fetch,git pull,必 ...
- Git起步--git安装与初次运行git前配置
在你开始使用 Git 前,需要将它安装在你的计算机上. 即便已经安装,最好将它升级到最新的版本. 你可以通过软件包或者其它安装程序来安装,或者下载源码编译安装. 一.Git安装 1. 在linux上安 ...
- 【Git】Git远程操作详解
Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Gi ...
- Git学习01 --git add, git commit , git log ,git status, git reset --hard, head
Git官方提供的快速入门教程:https://try.github.io/levels/1/challenges/1 特点:Git极其强大的分支管理:分布式版本 集中式版本控制系统,版本库是集中存放在 ...
随机推荐
- 表格分页——tablePagination
背景:表格是最为通用的展示方式,为了展示的统一性,以及分页组件的重用,这里写一个分页组件,供比较多或者较少数据2种表格进行分页展示. 分页组件: <template> <el-pag ...
- 修改tomcat使用的的编码方式
默认情况下,tomcat使用的的编码方式:iso8859-1 修改tomcat下的conf/server.xml文件 找到如下代码: < Connector port="8080 ...
- 支付宝手机网站支付(基于Java实现支付宝手机网站支付)
支付宝支付核心需要的参数是(APPID,PRIVATE_KEY,ALIPAY_PUBLIC_KEY) APPID:创建应用后就有的APPID. PRIVATE_KEY:应用私钥 ALIPAY_PUBL ...
- Python_逻辑运算符
1.逻辑运算符
- Elasticsearch 最佳运维实践 - 总结(一)
对于Elasticsearch的学习,需要清楚的明白它的每个核心概念,由浅入深的了解,才能更好的掌握这门技术.下面先简单罗列下Elasticsearch的核心概念: 一.Elasticsearch数据 ...
- JS与小程序页面生命周期
Page({ /** * 页面的初始数据 */ data: { }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { }, /** * 生命周 ...
- Vue实现一个图片懒加载插件(转载)
Vue是可以自定义指令的,最近学习过程中遇见了一个需要图片懒加载的功能,最后参考了别人的代码和思路自己重新写了一遍.以下将详细介绍如何实现自定义指令v-lazyload. 先看如何使用这个指令: &l ...
- c++面向对象模型---c++如何管理类,对象以及它们之间的联系
首先我们随意定义4个类结构 class cl1 { private: int age; string name; static int addr; public: cl1() { } void iwa ...
- BZOJ 1495 [NOI2006]网络收费(暴力DP)
题意 给定一棵满二叉树,每个叶节点有一个状态0/10/10/1,对于每两个叶节点i,ji,ji,j,如果这两个叶节点状态相同但他们的LCALCALCA所管辖的子树中的与他们状态相同的叶节点个数较少(少 ...
- CSS绝对定位详解
设置为绝对定位的元素框从文档流完全删除,并相对于其包含块定位,包含块可能是文档中的另一个元素或者是初始包含块.直线电机生产厂家 元素原先在正常文档流中所占的空间会关闭,就好像该元素原来不存在一样.元素 ...