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

问题描述 投票:197回答:5

我的git repo有问题。在我推送到服务器的最后几天,我收到这样的消息:“自动打包存储库以获得最佳性能”,它似乎没有消失并返回shell。

我也尝试检查一个新的分支,然后在我以前的分支上做一个rebase,然后做git gc删除未使用的历史对象,然后进行推送但仍然出现此消息。请让我知道我的回购发生了什么。

git git-rebase git-push
5个回答
274
投票

简短版本:它意味着它所说的,如果你让它完成,一切都会很好。

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

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

如果你让Git完成重新包装,这种情况不会再发生一段时间了。它确实需要一段时间,特别是如果你有很多大的二进制对象,但如果它正在触发,那么它表明它可能会大大减少repo占用的磁盘空间量。如果您真的不希望它发生,您可以更改配置参数gc.auto。如果你把它增加到远大于6700的东西,它会不那么频繁地发生,但是当它发生时需要更长的时间。如果你减少它,它仍然必须做你当前的重新包装,但随后它会更频繁地发生并且更快完成。如果将其设置为0,则会禁用自动重新打包。

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


39
投票

虽然Jefroni是正确的,有时自动打包只需要时间来完成,如果OP描述的自动打包消息持续多天,那么git的清理很可能缺少悬空物体,如this question所述。

要查看悬空对象是否触发有关自动打包的持续消息,请尝试运行git fsck。如果你得到一长串悬挂提交,你可以用它来清理它们

git gc --prune=now

我通常必须每隔2-3个月在我的仓库中运行此操作,此时自动打包消息在单次拉动后不会消失。


30
投票

要禁用一个项目:

cd your_project_dir
git config gc.auto 0

要全局禁用:

git config --global gc.auto 0

10
投票

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


1
投票

希望git gc --auto步骤现在(git 2.0.1,2014年6月25日)更有效率。 请参阅commit 62aad18Nguyễn Thái Ngọc Duy (pclouds)

gc --auto: do not lock refs in the background

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

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

继续在前台运行pack-refs和“reflog --prune”以停止并行引用更新。剩下的后台操作(重新打包,修剪和重新安装)不应该影响运行git进程。

和Git 2.22(2019年第二季度)further optimize git gc

© www.soinside.com 2019 - 2024. All rights reserved.