“自动打包存储库以获得最佳性能”是什么意思?


225

我的git仓库有问题。在过去的几天里,每当我推送到服务器时,我都会收到以下消息:“自动打包存储库以获得最佳性能”,并且它似乎并没有消失并返回外壳。

我还尝试签出到新分支,然后在我先前的分支上进行了重新设置,然后git gc删除了未使用的历史对象,然后进行了推送,但仍然出现此消息。请让我知道我的仓库正在发生什么。

Answers:


305

简短的版本:意思是说的话,如果您只说完,一切都会好起来的。

在大多数操作中(这可能会增加存储库中的松散(未打包)对象的数量(包括推送)),Git会调用git gc --auto。如果有足够的松散对象(默认情况下至少为6700),则它将调用git repack -d -l以打包它们。如果单独包装过多,也将它们重新包装成一个包装。

数据包是包含大量对象的增量压缩的单个文件。将对象存储在包中效率更高,但是打包(压缩)对象要花一些时间,因此Git最初会创建松散的对象,然后通过自动调用批量将它们打包git gc --auto

如果让Git完成重新包装,这种情况将不会再出现。确实确实需要一段时间,特别是如果您有很多大的二进制对象,但是如果它被触发,则表明它可能会大大减少存储库占用的磁盘空间。如果您确实不希望发生这种情况,可以更改config参数gc.auto。如果将其增加到比6700大得多的水平,则发生的频率会降低,但是会花费更长的时间。如果减少它,它仍然必须进行当前的重新包装,但是随后它将更频繁地发生并更快地完成。如果将其设置为0,它将禁用自动重新打包。

有关更多信息,请参见man git-gc(在之下--auto)和man git-config(在之下gc.auto)。


14
确实,这花了我大约5分钟,但确实完成了。好答案。
约书亚·品特

6
我们看到它在每次推动时都会发生(要花几秒钟,呵呵)。

2
@dpk:在正常情况下不应该发生这种情况-一次推送中的对象数量不应大到足以触发它(除非您的存储库很大和/或您要推送大量提交),因此一旦成功完成(您让它完成,对吧?),直到您逐步建立它,才应该再次发生。如果您无法解决问题,请提出另一个问题。
卡斯卡贝尔2012年

6
“如果让Git完成”,它可以 ...- fatal: Out of memory, malloc failed (tried to allocate 79610689 bytes) error: failed to run repack这就是将整个代码库粘贴到一个git repo中的结果。猜猜我要杀死应用程序并“手动”强制重新打包
ruffin

11
我每次做git pull都会得到它。我已经完成了手动git gc,但是每次我拉动它仍然会发生。奇怪的。
巴里·凯利

51

尽管Jefroni的观点是正确的,有时自动打包有时只需要一些时间才能完成,但是如OP所述,如果自动打包消息持续多天仍然存在,则git的清理很有可能会丢失悬挂的对象,如本问题所述

要查看悬空的对象是否正在触发有关自动打包的持续消息,请尝试运行git fsck。如果您有很长的悬空提交列表,则可以使用以下命令清除它们

git gc --prune=now

我通常必须每2-3个月在我的仓库中运行一次,这样一次拉动后自动打包消息就不会消失。


5
虽然不是公认的答案,但这正是我所需要的。在git pull过去的几天里,每次执行一次时,我都会收到消息,并且fsck确实显示了大量的悬空提交。
约恩·扎弗勒(JörnZaefferer)

36

要为一个项目禁用:

cd your_project_dir
git config gc.auto 0

要全局禁用:

git config --global gc.auto 0

2
我想我发现了如何:转到.git文件夹,打开配置文件,然后删除文本“ auto = 0”,然后保存。这似乎重新启用了自动打包功能。
阿德里安·凯斯特

18
git config --unset gc.auto
jtatum

10

Git正在运行git-repack,它将许多对象(=文件,提交和树)打包到一个打包文件中。当启发式说可以节省空间时,Git有时会这样做(一个打包文件包含压缩的对象增量,而objects /目录中的每个文件都包含压缩的完整文件内容)


2

希望这git gc --auto一步现在(2014年6月25日,git 2.0.1)更加有效。
提交62aad18阮泰玉维战(pclouds

gc --auto:不要在后台锁定引用

9f673f9gc:在后台运行--auto的配置选项-2014-02-08,Git 2.0.0)将“ gc --auto”置于后台,以减少用户的等待时间。
垃圾收集的一部分是pack-ref和修剪reflog。这些要求锁定某些引用,并且可能会中止试图锁定同一引用的其他进程。

如果gc --auto在脚本中间触发,则gc在后台保持锁可能会使脚本失败,这在9f673f9之前永远不会发生。

继续运行,pack-refsreflog --prune在前台运行“ ”以停止并行引用更新。其余的后台操作(重新打包,修剪和重新打包)不应影响正在运行的git进程。

Git 2.22(2019年第二季度)进一步优化git gc

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.