我的git仓库有问题。在过去的几天里,每当我推送到服务器时,我都会收到以下消息:“自动打包存储库以获得最佳性能”,并且它似乎并没有消失并返回外壳。
我还尝试签出到新分支,然后在我先前的分支上进行了重新设置,然后git gc
删除了未使用的历史对象,然后进行了推送,但仍然出现此消息。请让我知道我的仓库正在发生什么。
我的git仓库有问题。在过去的几天里,每当我推送到服务器时,我都会收到以下消息:“自动打包存储库以获得最佳性能”,并且它似乎并没有消失并返回外壳。
我还尝试签出到新分支,然后在我先前的分支上进行了重新设置,然后git gc
删除了未使用的历史对象,然后进行了推送,但仍然出现此消息。请让我知道我的仓库正在发生什么。
Answers:
简短的版本:意思是说的话,如果您只说完,一切都会好起来的。
在大多数操作中(这可能会增加存储库中的松散(未打包)对象的数量(包括推送)),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
)。
fatal: Out of memory, malloc failed (tried to allocate 79610689 bytes) error: failed to run repack
这就是将整个代码库粘贴到一个git repo中的结果。猜猜我要杀死应用程序并“手动”强制重新打包
尽管Jefroni的观点是正确的,有时自动打包有时只需要一些时间才能完成,但是如OP所述,如果自动打包消息持续多天仍然存在,则git的清理很有可能会丢失悬挂的对象,如本问题所述。
要查看悬空的对象是否正在触发有关自动打包的持续消息,请尝试运行git fsck
。如果您有很长的悬空提交列表,则可以使用以下命令清除它们
git gc --prune=now
我通常必须每2-3个月在我的仓库中运行一次,这样一次拉动后自动打包消息就不会消失。
git pull
过去的几天里,每次执行一次时,我都会收到消息,并且fsck
确实显示了大量的悬空提交。
希望这git gc --auto
一步现在(2014年6月25日,git 2.0.1)更加有效。
见提交62aad18由阮泰玉维战(pclouds
)
gc --auto
:不要在后台锁定引用9f673f9(
gc
:在后台运行--auto的配置选项-2014-02-08,Git 2.0.0)将“gc --auto
”置于后台,以减少用户的等待时间。
垃圾收集的一部分是pack-ref和修剪reflog。这些要求锁定某些引用,并且可能会中止试图锁定同一引用的其他进程。如果
gc --auto
在脚本中间触发,则gc在后台保持锁可能会使脚本失败,这在9f673f9之前永远不会发生。继续运行,
pack-refs
并reflog --prune
在前台运行“ ”以停止并行引用更新。其余的后台操作(重新打包,修剪和重新打包)不应影响正在运行的git进程。
Git 2.22(2019年第二季度)进一步优化git gc
。