git push致命错误:无法创建线程:资源暂时不可用。

64

我是Git的新手。 我想将一次大的提交推送到远程服务器,但问题在于:

当我使用

git push origin master

它返回了错误信息

Counting objects: 5009, done.
Delta compression using up to 16 threads.
fatal: unable to create thread: Resource temporarily unavailable
error: pack-objects died with strange error

那么我有没有办法为Delta压缩设置最大线程使用量呢。

感谢您的帮助,

Yuan Chen


1
以下是您可以运行的命令,通过登录远程系统来限制打包所需的内存量:git config --global pack.windowMemory "100m"git config --global pack.packSizeLimit "100m"git config --global pack.threads "1" - Adnan
4个回答

196

错误提示:"fatal: unable to create thread: Resource temporarily unavailable" 表明您的服务器内存不足,这可能是由于您的仓库中有大量大文件导致重新打包需要大量内存,或者由于限制了虚拟内存 - 通常情况下,或仅由于由于ulimit设置而对该帐户进行了限制。

无论如何,以下是您可以运行的命令,通过登录到远程系统(作为git运行的用户)并键入以下命令来限制打包所需的内存量:

git config --global pack.windowMemory "100m"
git config --global pack.packSizeLimit "100m"
git config --global pack.threads "1"

希望这能起作用。


37
许多共享主机解决方案会限制线程数量。通常,仅使用此答案中的最后一个命令将其降至<10即可解决问题。 - Qix - MONICA WAS MISTREATED
4
我在共享主机上尝试将代码推送到远程仓库时遇到问题,通过设置 pack.threads "10" 解决了此问题。当我试图运行 git gc 并进入重打包阶段时,遇到了类似的问题。同样使用此方法解决。祝一切顺利! - Fuzzy Logic
2
如果您的服务器使用智能HTTP协议,则可能无法为进程设置全局配置。相反,cd到git存储库本身的目录中,并在没有--global的情况下运行相同的命令。 - yig
3
我可以确认,在Inmotion共享主机上设置git config --global pack.threads "5"就足以解决这个问题。谢谢! - coccoinomane
1
它节省了我的时间。 这个答案应该被接受。 谢谢。 - hobbydev
显示剩余3条评论

54

在共享托管中,我们主要有限的CPU资源,大多数情况下只有1个CPU,因此多线程在那里不起作用。实际上,这个错误是由于有限的CPU资源导致的。

只需进行此git设置即可解决此问题。

git config --global pack.threads "1"

这将限制git只能创建一个线程。


7

我也遇到过这个错误。简单来说,这个错误是因为你想将一个100mb的文件复制到一个剩余空间只有50mb(或更少)的硬盘中。要解决这个问题,需要通过SSH连接到服务器并运行以下命令:

git config --global pack.windowMemory "100m"
git config --global pack.packSizeLimit "100m"

尝试这些返回的内容:xcrun: 错误:无效的活动开发者路径(/Library/Developer/CommandLineTools),缺少 /Library/Developer/CommandLineTools/usr/bin/xcrun 的 xcrun - HappyHands31
如果你遇到了这个问题,请查看这篇文章:https://dev59.com/91QK5IYBdhLWcg3wEr0X - 问题已解决。 - HappyHands31

3
"unable to create thread: Resource temporarily unavailable" 表示远程服务器出现问题(例如没有更多的可用内存)。
关于 delta,您可以调整以下配置
pack.deltaCacheSize

在 git-pack-objects(1) 中用于缓存增量的最大内存限制,超出该限制后才会将它们写入包中。
此缓存可加速写入对象阶段,因为当找到所有对象的最佳匹配时,就不必重新计算最终增量结果。
但是,在内存紧张的机器上重新打包大型仓库可能会受到严重影响,特别是如果此缓存将系统推入交换状态中。
0 表示无限制。最小值为 1 字节,可用于虚拟禁用此缓存。默认为 256 MiB。
pack.deltaCacheLimit

git-pack-objects(1)使用的最大delta大小。
该缓存用于通过在找到所有对象的最佳匹配之后不必重新计算最终delta结果来加快写入对象阶段的速度。 默认值为1000。

SO问题 "Git pull失败,显示bad pack header错误" 引用了其他pack-相关的配置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接