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

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

手册页面简单地说:

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

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

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

几十名开发人员每天检查2-3次,每天检查几十个项目,您可能需要每晚检查一次。

尽pipe如此,运行频率比所需要的频率还要高。

我现在要做的就是运行它,然后在一个星期之后测量磁盘利用率,再次运行它,然后再次测量磁盘利用率。 如果它下降5%,那么每周运行一次。 如果下降得更多,则更频繁地运行。 如果它减less,那么运行频率就会降低。

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

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

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

最新版本的git在需要的时候自动运行gc,所以你不需要做任何事情。 请参阅man git-gc(1)的选项部分:“执行可能会产生许多松散对象的操作后,一些git命令会运行git gc –auto。

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

 This repository currently has approximately 1500 loose objects. 

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

 $ git count-objects 

除了从源头上 ,git-gui会自己做math,实际上在.git/objects文件夹中计算一些东西,可能会带来一个近似值(我不知道tcl是正确读取的!)。

无论如何,它似乎都会根据大约 300个松散物体的任意数字给出警告。

把它放在每天晚上(下午?)运行的cron作业中,当你在睡觉的时候。

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

新的(Git 2.0 Q2 2014)设置gc.autodetach可以不中断地gc.autodetach

参见提交4c4ac4d并提交9f673f9 ( NguyễnTháiNgọcDuy,aka pclouds ):

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


从2.0版本开始,有一个错误:git 2.7(Q4 2015)将确保不会丢失错误信息
参见NguyễnTháiNgọcDuy( pclouds )的 commit 329e6e8 (2015年9月19日) 。
(由Junio C gitster合并- gitster -在提交076c827 ,2015年10月15日)

gc :从daemonized gc --auto保存日志,下次打印

虽然提交9f673f9 ( gc :config选项用于在后台运行--auto – 2014-02-08)有助于减less有关gc --auto占用terminal的一些抱怨,但会产生另一组问题。

这个集合中最新的是,由于守护进程的结果, stderr被closures,所有的警告都失去了。 cmd_gc()结束时的警告特别重要,因为它告诉用户如何避免“ gc --auto ”重复运行。
由于stderrclosures,用户不知道,自然他们抱怨' gc --auto '浪费CPU。

守护进程gc现在将stderr保存到$GIT_DIR/gc.log
以下gc --auto将不会运行,并且gc.log打印出来,直到用户删除gc.log

这个引用来自于; 使用Git进行版本控制

Git自动运行垃圾回收

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

•推送到远程存储库时

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

•当某些命令(如git reflog)过期时明确请求它

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

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

•如果你刚刚完成了一个gitfilter分支。 回想一下,filter-branch重写了许多提交,引入了新的提交,并在ref满足结果时应将其删除。 所有那些死对象(不再被引用,因为你只是删除了一个指向它们的引用)应该通过垃圾回收来移除。

•一些可能引入许多松散对象的命令之后。 例如,这可能是一个很大的重组努力。

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

•如果有可能要恢复的孤儿参考

•在git rerere的情况下,你不需要永远保存解决scheme

•只有标签和分支足以导致Git永久保留提交

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

•只有标签和分支足以导致Git永久保留提交

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

我使用的时候,我做了一个大的提交,最重要的是当我从存储库中删除更多的文件..之后,提交更快