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极其强大的分支管理:分布式版本 集中式版本控制系统,版本库是集中存放在 ...
随机推荐
- 碰撞器Colider 触发器
碰撞器可以让所依附的游戏物件对其他碰撞体产生碰撞行为(其他游戏物体必须具有Rigidbody组件) 对于不规则形状的物体,通常使用组合式碰撞体而不是网格碰撞器,以为网格碰撞器以模型的网格为基础,更为复 ...
- sed 追加文件内容
追加用法总结 1.a 在匹配行后面追加 2.i 在匹配行前面追加 3.r 将文件内容追加到匹配行后面 4.w 将匹配行写入指定文件 在匹配行后面追加 a passwd文件第10行后面追加"A ...
- 【JUC】1.线程
先复习一下线程的东西: Java线程的内存模型 主内存与工作内存 Java内存模型主要定义了程序中各个变量的访问规则 所有的变量都在主内存,Java堆(线程共享) 每条线程都有自己的工作内存,虚拟机栈 ...
- Flutter——Radio组件、RadioListTile组件(单选按钮组件)
Radio组件 Radio组件的常用属性: 属性 描述 value 单选的值 onChanged 改变时触发 activeColor 选中的颜色.背景颜色 groupValue 选择组的值 impor ...
- Go语言实现简单的TCP、UDP链接
⼀.使用Golang创建⼀一个TCP连接 1.服务端处理理流程 a.监听端口 b.接受客户端的链接 c.创建Goroutine,处理这个链接(⼀个服务端要链接多个客户端,所以使用Gorouti ...
- Spring Security 流程
首先创建4个类 流程大致如下: 1.容器启动 加载系统资源与权限列表(HashMap) MyInvocationSecurityMetadataSourceService中的loadResourceD ...
- git 将master分支合到自己的开发分支
背景: 一般开发自己的分支都是从最新的master上拉取,但中间master会有改动,此时需要将最新的master合到自己的分支中 命令: 1. 查看当前的分支,星号标识为当前分支:(如果查询结果有m ...
- JQgrid处理json数据
jqGrid 实例中文版网址:http://blog.mn886.net/jqGrid/国外官网:http://www.trirand.com/blog/jqgrid/jqgrid.html http ...
- KM 最大权匹配 UVA 1411/POJ 3565
#include <bits/stdc++.h> using namespace std; inline void read(int &num) { char ch; num = ...
- 070_Shell 脚本对信号的处理,执行脚本后,按键盘 Ctrl+C 无法终止的脚本
#!/bin/bash#使用 trap 命令可以拦截用户通过键盘或 kill 命令发送过来的信号#使用 kill -l 可以查看 Linux 系统中所有的信号列表,其中 2 代表 Ctrl+C#tra ...