您应该多久使用一次git-gc?
manual page只是说:
鼓励用户定期在每个存储库中运行此任务,以保持良好的磁盘空间利用率和良好的运行性能。
是否有一些命令可以获取一些对象计数以确定是否需要gc?
答案 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 4c4ac4d和commit 9f673f9(Nguyễ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 9f673f9(
gc
:在后台运行--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