我的git repo出了问题。在我推送到服务器的最后几天,我收到以下消息:"自动打包存储库以获得最佳性能",它似乎没有消失并返回shell。
我还尝试检查一个新的分支,然后在我之前的分支上执行rebase,然后git gc
删除未使用的历史记录对象,然后执行推送但仍显示此消息。请让我知道我的回购邮件发生了什么。
答案 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-config
(gc.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
pclouds
)
git gc --auto
:不要在后台锁定引用9f673f9(
gc --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
。