“自动打包存储库以获得最佳性能”;的意思吗?

我的现金回购有点问题。在过去的几天里,每当我向服务器推送时,我都会收到这样的消息:“自动打包存储库以获得最佳性能”,它似乎并没有消失并返回shell。

我还尝试签出到一个新的分支,然后在我的前一个分支上做一个rebase,然后做git gc来删除未使用的历史对象,然后做一个推送,但仍然出现此消息。请让我知道我的回购是怎么回事。

86781 次浏览

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

简而言之:它就是它所说的,如果你让它结束,一切都会好起来的。

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

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

如果让Git完成重新打包,这种情况在一段时间内不会再次发生。它确实需要一段时间,特别是如果你有很多大的二进制对象,但如果它是触发的,那么这是一个迹象,它可能会大大减少由回购占用的磁盘空间量。如果你真的不希望它发生,你可以改变配置参数gc.auto。如果您将它增加到比6700大得多的值,它发生的频率就会降低,但发生的时间会更长。如果你减少了它,它仍然需要进行当前的重新打包,但随后它会发生得更频繁,完成得更快。如果您将其设置为0,它将禁用自动重新包装。

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

禁用一个项目:

cd your_project_dir
git config gc.auto 0

全局禁用:

git config --global gc.auto 0
希望git gc --auto步骤现在(git 2.0.1, 2014年6月25日)更有效 参见提交62年aad18 by ngibmc Duy (pclouds)

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

9 f673f9 (gc: config option for running——auto in background - 2014-02-08, Git 2.0.0)将“gc --auto”置于后台以减少用户的等待时间 垃圾收集的一部分是包引用和修剪reflogs。这需要锁定一些引用,并且可能会中止试图锁定同一引用的其他进程

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

继续在前台运行pack-refs和"reflog --prune"来停止并行引用更新。其余的后台操作(重新打包、剪枝和重放)不应该影响git进程的运行。

和Git 2.22 (Q2 2019) 进一步优化git gc

虽然Jefroni是正确的,有时自动打包只需要时间来完成,但如果自动打包消息像OP所描述的那样持续了好几天,那么git的清理很有可能丢失了这个问题中所描述的悬空对象。

要查看悬空对象是否触发有关自动打包的持续消息,请尝试运行git fsck。如果你得到一个很长的悬垂提交列表,你可以用

git gc --prune=now

我通常必须每隔2-3个月在我的回购中运行一次,因为自动打包消息在一次拉取后没有消失。