您应该多久使用一次git-gc?


233

您应该多久使用一次git-gc?

手册只是说:

鼓励用户在每个存储库中定期运行此任务,以保持良好的磁盘空间利用率和良好的运行性能。

是否有一些命令来获取一些对象计数,以确定是否是时候进行gc?


像这样的任务对于cron的总理候选人(如果你使用的是Linux)minhajuddin.com/2011/12/09/...
Khaja Minhajuddin

1
注意:设置gc.autodetach(Git 2.0 Q2 2014)可以帮助运行git gc --auto而不会激怒用户。请参阅下面的答案
VonC

Answers:


204

这主要取决于使用多少存储库。一个用户每天检查一次,而分支/合并/等操作每周检查一次,您可能不需要每年运行一次以上。

数十名开发人员从事数十个项目,每个项目每天要检查2-3次,因此您可能希望每晚运行一次。

不过,频繁运行它并不会受到伤害。

我要做的是现在运行它,然后从现在开始的一周内测量磁盘利用率,再次运行,然后再次测量磁盘利用率。如果大小减少5%,则每周运行一次。如果下降幅度更大,则应更频繁地运行它。如果其下降幅度较小,则应减少运行频率。


17
手册说:“某些git命令在执行可能会创建许多松散对象的操作后运行git gc --auto。” 有人知道实际上运行了哪些命令吗?
约书亚舞

2
大量的git rebase是一个明显的例子,因为许多提交都被重写为新的历史记录-在您的存储库中保留了许多旧的提交,这些旧的提交已经成为当前分支的一部分
mafrosis 2014年

20
“频繁运行它不会有什么坏处。” ...我并不完全同意。正如亚里士多德指出的那样,悬空提交可以提供良好的备份机制。
杰森·贝克

105

请注意,垃圾收集存储库的不利之处在于,垃圾被收集了。众所周知,作为计算机用户,我们现在认为是垃圾的文件将来三天之内可能会变得非常有价值。git保留了大部分碎片的事实已经节省了我的培根数次–通过浏览所有悬空的提交,我已经恢复了很多我偶然罐装的工作。

因此,在您的私人克隆中别太整齐了。几乎不需要它。

OTOH,对于主要用作远程设备的回购协议,数据可恢复性的价值值得怀疑。所有开发人员推动和/或撤离的地方。在那里开始频繁运行GC和重新包装可能是明智的。


38
FWIW并非所有松散的对象都被垃圾收集,默认情况下仅收集两个星期以上的对象(请参见git gc --help,特别是该--prune选项)。还提到了gc.reflogExpire,这使我相信您在过去90天内访问过的任何委托都不会被收集。(我的git版本:v1.7.6)
RobM 2011年

30

git的最新版本会在需要时自动运行gc,因此您无需执行任何操作。请参阅man git-gc(1)的 “ 选项”部分:“某些git命令在执行可能会创建许多松散对象的操作后运行git gc --auto。”


13
我只是第一次在运行了几年的存储库上运行它,而我的.git从1600万增加到290万,大小减小了82%。因此,手动运行该命令似乎仍然很有用。
Darshan Rivka Whittle 2015年

@DarshanRivkaWhittle在那几年中您更新了git吗?
std''OrgnlDave

1
@ std''OrgnlDave是的,我一直在运行Arch上最新的版本。我再次运行了它,这也许是自上次评论以来第一次(感谢您的评论提醒我),我的.git从81M变为13M。我gc --auto猜我一定不能运行任何运行的命令。
Darshan Rivka Whittle,

18

如果您使用的是Git-Gui,它会告诉您何时应该担心:

This repository currently has approximately 1500 loose objects.

以下命令将带来类似的数字:

$ git count-objects

除了它的来源,git-gui会自己进行数学运算,实际上是对.git/objects文件夹中的内容进行计数,并且可能带来一个近似值(我不知道tcl正确地阅读它!)。

在任何情况下,似乎都会根据300个松散物体附近的任意数量发出警告。


确实确实会发出警告,但是在让它运行gc时,大多数时候gc不会做任何事情。因此,依靠git gui来做的就是等待超过6000多个松散的对象,而总是必须单击run gc并等待一分钟或取消:/也许有人应该以某种方式修复git gui,以检查max松动对象计数,直到计数达到限制为止才显示对话框。
mlatu 2014年

是的,我同意。当我写这篇文章时,我只是想引起注意。两者Git-Guicount-objects都不是这里问题的好答案...但是它们应该是!
cregox 2014年

我的意思不是说这是一个错误的答案,只是想指出git gui在大多数情况下什么都不做。虽然我想git gc也不做很多,除非有足够的事情要做或您使用了主动开关。
mlatu 2014年


7

我在进行大量结帐后使用了git gc,并且有很多新对象。它可以节省空间。例如,如果您使用git-svn签出一个大型SVN项目并执行git gc,通常可以节省大量空间


这仍然是真的吗?即使在'08硬盘空间也很便宜,以此作为运行的理由似乎毫无意义
Thymine

7

您可以使用新的设置(Git 2.0 Q2 2014)毫无中断地做到这一点gc.autodetach

参见commit 4c4ac4d9f673f9NguyễnTháiNgọcDuy,aka pclouds):

gc --auto需要花费时间,并且可以暂时阻止用户(但不会那么烦人)。
使它在支持它的系统上在后台运行。
在后台运行唯一丢失的是打印输出。但是gc output并不是很有趣。
您可以通过更改将其保持在前台gc.autodetach


从该2.0版本开始,尽管存在一个错误:git 2.7(2015年第四季度)将确保不会丢失错误消息
提交329e6e8通过(2015年9月19日)阮泰玉维战(pclouds
(由Junio C gitsterHamano合并--076c827号提交中,2015年10月15日)

gc:保存守护进程中的日志gc --auto并在下次打印

虽然commit 9f673f9gc--auto在后台运行的config选项-2014-02-08)有助于减少一些关于' gc --auto'占用终端的抱怨,但它会带来另一组问题。

作为守护程序的结果,此集合中的最新集合已stderr关闭,所有警告均丢失。结尾的警告cmd_gc()特别重要,因为它告诉用户如何避免gc --auto重复运行。
因为stderr是关闭的,所以用户不知道,他们自然会抱怨' gc --auto'浪费CPU。

守护进程gc现在保存stderr$GIT_DIR/gc.log。除非用户删除,否则不会运行并打印
以下gc --auto内容gc.loggc.log


6

引用来自: 使用Git进行版本控制

Git自动运行垃圾收集

•如果存储库中有太多松散的对象

•推送到远程存储库时

•在执行一些可能引入许多松散对象的命令之后

•当某些命令(例如git reflog到期)显式请求时

最后,当您使用git gc命令明确请求垃圾回收时,就会发生垃圾回收。但是那应该是什么时候呢?这个问题没有可靠的答案,但是有一些好的建议和最佳实践。

您应该考虑在以下几种情况下手动运行git gc:

•如果您刚刚完成了git filter-branch。回想一下,filter-branch重写了许多提交,引入了新的提交,并将旧的提交留在ref上,当您对结果满意时应将其删除。所有这些死对象(由于您刚刚删除了一个指向它们的引用而不再引用)应通过垃圾回收删除。

•在执行一些可能引入许多松散对象的命令之后。例如,这可能是一项大型的基础工作。

另一方面,您何时应该警惕垃圾回收?

•如果有可能需要恢复的孤立裁判

•在git rerere的情况下,您无需永远保存分辨率

•仅在标签和分支足以使Git永久保留提交的情况下

•在FETCH_HEAD检索(通过git fetch进行URL直接检索)的上下文中,因为它们会立即受到垃圾回收的影响


2
我的树中有无法访问的提交(作为的结果git commit --amend)。可以用验证git log --reflog。我将分支推送到远程存储库,然后再次检查了我的树。无法到达的提交仍然存在。显然git gc,此推送发生时未运行。……?
chharvey '16

4

我在执行大型提交时使用,尤其是当我从存储库中删除更多文件时使用。.之后,提交速度更快


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.