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

Fur*_*har 211 git git-push git-rebase

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

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

Cas*_*bel 291

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

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

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

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

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

  • 事实上,我花了大约5分钟,但它确实完成了.很好的答案. (14认同)
  • 每次我做一个git pull我都会得到它.我已经完成了手动git gc,但每次拉动时它仍然会发生.奇怪的. (10认同)
  • 我们看到每次推动都会发生这种情况(等几秒钟,嘿). (5认同)
  • "如果你让Git完成",_并且它可以_...`致命:内存不足,malloc失败(试图分配79610689字节)错误:无法运行重新包装 - 这就是我将整个代码库保留到一个git repo.猜猜我要杀死应用程序并强行重新打包"手动" (5认同)
  • @dpk:在正常情况下不应该发生这种情况 - 单次推送中的对象数量不应大到足以触发它(除非你的存储库是*巨大的*和/或你正在推动大量的提交),所以一次它成功地完成了(你让它完整,对吗?)它不应该再发生,直到你建立它.如果你无法弄明白,请问一个单独的问题. (2认同)
  • 是的,我知道 Windows 的行为,但禁用 gc 是迄今为止我找到的唯一可行的解​​决方案。通常,当我推送时,我没有时间去调试窗口,我需要修复才能完成我的工作。 (2认同)

wbh*_*ing 44

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

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

git gc --prune=now

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

  • 虽然不是公认的答案,但这正是我所需要的.每次我做了一次'git pull`,几天之后,我收到了消息,并且`fsck`确实显示了大量的悬空提交. (4认同)
  • 仅供参考 - 要使 `git gc --prune=now` 正常工作,请确保所有 IDE、Git bash 和 Git UI 程序都已关闭。否则,它将无法工作,因为资源/文件被“锁定”。发生在我身上的是因为我忘记关闭我的 GitKraken 工具。 (4认同)

And*_*dén 33

要禁用一个项目:

cd your_project_dir
git config gc.auto 0
Run Code Online (Sandbox Code Playgroud)

要全局禁用:

git config --global gc.auto 0
Run Code Online (Sandbox Code Playgroud)

  • git config --unset gc.auto (17认同)
  • 我想我发现了如何:转到.git文件夹,打开配置文件,然后删除文本'auto = 0',并保存.这似乎重新启用了自动包装. (2认同)

Rud*_*udi 10

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