你应该多久使用一次 git-gc?
手册页简单地说:
鼓励用户在每个存储库中定期运行此任务,以保持良好的磁盘空间利用率和良好的运行性能。
是否有一些命令可以获取一些对象计数以确定是否该 gc 了?
这主要取决于存储库的使用量。如果一个用户每天签入一次,并且每周执行一次分支/合并/等操作,您可能不需要每年运行一次以上。
有几十个开发人员在处理几十个项目,每个项目每天检查 2-3 次,您可能希望每晚运行它。
不过,比需要的更频繁地运行它不会有什么坏处。
我要做的是现在运行它,然后在一周后测量磁盘利用率,再次运行它,然后再次测量磁盘利用率。如果它的大小下降 5%,则每周运行一次。如果下降更多,则更频繁地运行它。如果下降较少,则减少运行频率。
请注意,垃圾收集存储库的缺点是,垃圾会被收集。众所周知,作为计算机用户,我们现在认为是垃圾的文件可能在未来三天内变得非常有价值。git 保留其大部分碎片的事实多次拯救了我的培根——通过浏览所有悬空提交,我恢复了许多我不小心封存的工作。
所以不要在你的私人克隆中过于整洁。几乎不需要它。
OTOH,对于主要用作遥控器的存储库,数据可恢复性的价值是值得怀疑的,例如。所有开发人员推入和/或拉出的地方。在那里,经常启动 GC 运行和重新打包可能是明智的。
最新版本的 git 会在需要时自动运行 gc,因此您无需执行任何操作。请参阅man git-gc(1)的选项部分:“一些 git 命令在执行可能创建许多松散对象的操作后运行 git gc --auto。”
将它放在每晚(下午?)在你睡觉时运行的 cron 作业中。
使用新的 (Git 2.0 Q2 2014) 设置,您可以在没有任何中断的情况下执行此操作gc.autodetach
。
请参阅提交 4c4ac4d和提交 9f673f9(Nguyễn Thái Ngọc Duy,又名 pclouds):
gc --auto
需要时间并且可以暂时阻止用户(但同样令人讨厌)。
让它在支持它的系统上在后台运行。
在后台运行时唯一丢失的是打印输出。但gc output
并不是很有趣。
您可以通过更改将其保持在前台gc.autodetach
。
自该 2.0 版本以来,虽然存在一个错误:git 2.7 (Q4 2015) 将确保不会丢失错误消息。
请参阅Nguyễn Thái Ngọc Duy ( )的提交 329e6e8(2015 年 9 月 19 日) 。(由Junio C Hamano 合并 -- --在提交 076c827中,2015 年 10 月 15 日)pclouds
gitster
gc
: 从守护进程中保存日志gc --auto
并在下次打印虽然提交 9f673f9(
gc
:用于在后台运行的配置选项--auto
- 2014-02-08)有助于减少一些关于“”占用终端的抱怨gc --auto
,但它会产生另一组问题。由于守护进程,该集合中的最新版本
stderr
已关闭,并且所有警告都丢失了。这个末尾的警告cmd_gc()
特别重要,因为它告诉用户如何避免“gc --auto
”重复运行。
因为stderr是关闭的,用户不知道,自然会抱怨'gc --auto
'浪费CPU。Daemonized
gc
现在保存stderr
到$GIT_DIR/gc.log
. 在用户删除之前,
Followinggc --auto
不会运行并gc.log
gc.log
打印出来。
我在进行大量结帐后使用 git gc ,并且有很多新对象。它可以节省空间。例如,如果您使用 git-svn 签出一个大型 SVN 项目,然后执行 git gc,您通常会节省大量空间
此报价来自; 使用 Git 进行版本控制
Git 自动运行垃圾收集:
• 如果存储库中有太多松散对象
• 当推送到远程存储库时
• 在一些可能引入许多松散对象的命令之后
• 当某些命令(如 git reflog)过期时明确请求它
最后,当您使用 git gc 命令明确请求垃圾收集时,就会发生垃圾收集。但那应该是什么时候呢?这个问题没有可靠的答案,但有一些好的建议和最佳实践。
您应该考虑在以下几种情况下手动运行 git gc:
• 如果您刚刚完成了一个 git filter-branch 。回想一下,filter-branch 重写了许多提交,引入了新的提交,并将旧的提交留在了一个 ref 上,当您对结果感到满意时应该将其删除。所有那些死对象(由于您刚刚删除了指向它们的一个引用,因此不再被引用)应该通过垃圾回收来删除。
• 在一些可能引入许多松散对象的命令之后。例如,这可能是一个很大的变基工作。
另一方面,什么时候应该警惕垃圾收集?
• 如果存在您可能想要恢复的孤立引用
• 在 git rerere 的上下文中,您不需要永远保存决议
• 在只有标签和分支足以使 Git 永久保留提交的情况下
• 在 FETCH_HEAD 检索(通过 git fetch 的 URL 直接检索)的上下文中,因为它们会立即受到垃圾回收的影响
我在进行大提交时使用,尤其是当我从存储库中删除更多文件时。之后,提交速度更快
您不必git gc
经常使用,因为git gc
(垃圾收集)会在几个常用命令上自动运行:
git pull
git merge
git rebase
git commit