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

时间:2008-09-11 02:59:14

标签: git git-gc

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

manual page只是说:

  

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

是否有一些命令可以获取一些对象计数以确定是否需要gc?

10 个答案:

答案 0 :(得分:190)

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

有几十个开发人员正在处理几十个项目,每个项目每天检查2-3次,您可能希望每晚运行它。

但是,运行它的频率不会超过需要。

我现在要做的就是现在运行它,然后从现在起一周后测量磁盘利用率,再次运行它,并再次测量磁盘利用率。如果它的尺寸下降了5%,那么每周运行一次。如果它下降更多,则更频繁地运行它。如果它减少了,那么不那么频繁地运行它。

答案 1 :(得分:98)

请注意,垃圾收集存储库的缺点是收集垃圾。众所周知,作为计算机用户,我们现在认为垃圾的文件可能会在未来三天变得非常有价值。 git保留了大部分碎片的事实已经多次保存我的培根 - 通过浏览所有悬挂的提交,我已经恢复了很多我不小心制作的工作。

所以不要在你的私人克隆中做太多的整洁怪胎。几乎没有必要。

OTOH,对于主要用作遥控器的回购,数据可恢复性的价值是有问题的,例如。所有开发者推动和/或拉动的地方。在那里,开始GC运行和频繁重新包装可能是明智的。

答案 2 :(得分:30)

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

答案 3 :(得分:17)

如果你正在使用Git-Gui,那么你应该担心tells you

This repository currently has approximately 1500 loose objects.

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

$ git count-objects

除了from its source之外,git-gui会自己做数学计算,实际上是在.git/objects文件夹中计算一些内容并且可能带来一个近似值(我不知道tcl来正确阅读该!)。

在任何情况下,似乎都会根据围绕 300个松散对象发出警告。

答案 4 :(得分:7)

把它放在一个每天晚上(下午?)睡觉的cron工作中。

答案 5 :(得分:7)

我做了大量结账后使用git gc,并且有很多新对象。它可以节省空间。例如。如果你使用git-svn结账一个大的SVN项目,并做一个git gc,你通常会节省很多空间

答案 6 :(得分:7)

您可以在不中断的情况下使用新的(Git 2.0 Q2 2014)设置gc.autodetach

请参阅commit 4c4ac4dcommit 9f673f9Nguyễn Thái Ngọc Duy, aka pclouds):

  

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

将其保留在前台

自2.0版本发布以来,有一个错误:git 2.7(2015年第4季度)将确保不会丢失错误消息
commit 329e6e8查看Nguyễn Thái Ngọc Duy (pclouds)(2015年9月19日) Junio C Hamano -- gitster --commit 076c827合并,2015年10月15日)

  

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

     

虽然commit 9f673f9gc:在后台运行--auto的配置选项 - 2014-02-08)有助于减少一些有关' gc --auto&#的投诉39;占用终端,会产生另一套问题。

     

此套装中的最新版本是,作为守护程序的结果,stderr已关闭,所有警告都将丢失。 cmd_gc()结尾处的此警告特别重要,因为它告诉用户如何避免" gc --auto"反复跑步   由于stderr关闭,用户不知道,他们自然会抱怨' gc --auto'浪费CPU。

     

守护gc现在将stderr保存到$GIT_DIR/gc.log
  在用户删除gc --auto
之前,gc.log将无法投放并gc.log打印出来。

答案 7 :(得分:6)

此引用取自; Version Control with Git

  

Git自动运行垃圾收集

     

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

     

•推送到远程存储库时

     

•一些可能引入许多松散物体的命令之后

     

•某些命令(例如git reflog)明确请求它

     

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

     

您应该考虑手动运行git gc   情况:

     

•如果您刚刚完成了git过滤器分支。回想起那个   filter-branch重写了许多提交,引入了新的提交和离开   在你满意的时候应该删除的旧的那些   结果。所有那些死亡的物体(不再是那些物体)   引用,因为你刚删除指向它们的一个ref)   应该通过垃圾收集删除。

     

•在一些可能引入许多松散物体的命令之后。这个   例如,可能是一个很大的变革努力。

     

另一方面,    你什么时候应该警惕垃圾收集?

     

•如果您有可能想要恢复的孤立引用

     

•在git rerere的上下文中,你不需要保存   永远的决议

     

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

     

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

     

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

     

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

答案 8 :(得分:4)

我在进行大提交时使用,最重要的是当我从存储库中删除更多文件时...之后,提交更快

答案 9 :(得分:0)

您不必经常使用git gc,因为git gc(垃圾收集)是在几个常用命令上自动运行的:

git pull
git merge
git rebase
git commit

来源:git gc best practices and FAQS