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

时间:2011-12-26 08:03:55

标签: git git-rebase git-push

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

我还尝试检查一个新的分支,然后在我之前的分支上执行rebase,然后git gc删除未使用的历史记录对象,然后执行推送但仍显示此消息。请让我知道我的回购邮件发生了什么。

5 个答案:

答案 0 :(得分:273)

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

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

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

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

有关详细信息,请参阅man git-gc--auto下)和man git-configgc.auto下)。

答案 1 :(得分:38)

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

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

清理它们

git gc --prune=now

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

答案 2 :(得分:30)

禁用一个项目:

cd your_project_dir
git config gc.auto 0

全局禁用:

git config --global gc.auto 0

答案 3 :(得分:10)

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

答案 4 :(得分:1)

希望现在({1}}步骤(git 2.0.1,2014年6月25日)更有效率。
commit 62aad18

查看Nguyễn Thái Ngọc Duy (pclouds)

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

  

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

     

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

     

继续投放gc --auto和" pack-refs"在前台停止并行ref更新。其余的后台操作(重新包装,修剪和重新安装)不应影响运行git进程。

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