247

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

手册页简单地说:

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

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

4

10 回答 10

216

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

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

不过,比需要的更频繁地运行它不会有什么坏处。

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

于 2008-09-11T03:10:24.350 回答
110

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

所以不要在你的私人克隆中过于整洁。几乎不需要它。

OTOH,对于主要用作遥控器的存储库,数据可恢复性的价值是值得怀疑的,例如。所有开发人员推入和/或拉出的地方。在那里,经常启动 GC 运行和重新打包可能是明智的。

于 2008-09-17T20:41:39.217 回答
33

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

于 2008-09-15T21:23:00.070 回答
21

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

This repository currently has approximately 1500 loose objects.

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

$ git count-objects

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

无论如何,它似乎是根据大约300 个松散物体的任意数量发出警告。

于 2013-08-30T20:50:28.873 回答
8

将它放在每晚(下午?)在你睡觉时运行的 cron 作业中。

于 2008-09-11T04:00:27.927 回答
8

使用新的 (Git 2.0 Q2 2014) 设置,您可以在没有任何中断的情况下执行此操作gc.autodetach

请参阅提交 4c4ac4d提交 9f673f9Nguyễ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并在下次打印

虽然提交 9f673f9gc:用于在后台运行的配置选项--auto- 2014-02-08)有助于减少一些关于“”占用终端的抱怨gc --auto,但它会产生另一组问题。

由于守护进程,该集合中的最新版本stderr已关闭,并且所有警告都丢失了。这个末尾的警告cmd_gc()特别重要,因为它告诉用户如何避免“ gc --auto”重复运行。
因为stderr是关闭的,用户不知道,自然会抱怨' gc --auto'浪费CPU。

Daemonizedgc现在保存stderr$GIT_DIR/gc.log. 在用户删除之前,
Followinggc --auto不会运行并gc.loggc.log
打印出来。

于 2014-03-12T16:39:30.963 回答
7

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

于 2008-09-15T21:16:46.530 回答
7

此报价来自; 使用 Git 进行版本控制

Git 自动运行垃圾收集

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

• 当推送到远程存储库时

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

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

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

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

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

• 在一些可能引入许多松散对象的命令之后。例如,这可能是一个很大的变基工作。

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

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

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

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

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

于 2015-05-14T21:20:03.753 回答
4

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

于 2014-04-27T22:53:34.913 回答
3

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

git pull
git merge
git rebase
git commit

来源:git gc 最佳实践和常见问题解答

于 2019-07-31T11:50:43.253 回答