15

我在使用 Git 时遇到问题,我收到以下消息:

> git fetch
error: cannot create pipe for ssh: Too many open files
fatal: unable to fork

系统管理员增加了我的文件限制,但并没有解决问题。此外,我对使用 vi 创建新文件没有问题。

尝试推送新分支时,我收到类似的消息:

git push origin test_this_broken_git 错误:无法创建管道:打开的文件太多致命:发送包:无法分叉边带解复用器

有人可以确切地回答为什么会这样吗?我最近没有对我的 git 配置进行任何更改,并已手动验证。

4

2 回答 2

16

有两个类似的错误消息:

EMFILE:打开的文件太多
ENFILE:系统中打开的文件过多

看起来您正在获取EMFILE,这意味着已超出单个进程的文件数。因此,检查是否vi可以打开文件是无关紧要的——<code>vi 将使用它自己的、单独的文件表。通过以下方式检查您的限制:

$ ulimit -n
1024

所以在我的系统上,单个进程中有 1024 个打开文件的限制。您不需要询问您的系统管理员(请不要使用缩写 SA,它太不透明;如果您必须缩写,请使用“sysadmin”)来提高限制。

您可能希望通过在strace.

这可能是 Git 或库中的错误,也可能是您使用的是旧版本的东西,或者可能是更奇怪的东西。首先尝试strace查看它打开了哪些文件,然后检查 Git 是否关闭了这些文件。

来自 Hazok 的更新:

使用上述建议后,事实证明错误是由太多松散的对象引起的。有太多松散的对象,因为git gc没有足够频繁地运行。

于 2013-03-13T01:40:15.973 回答
3

为什么会这样?

git 文档

当存储库中的松散对象大约超过这么多时, git gc --auto 将打包它们。一些 Porcelain 命令不时使用此命令执行轻量级垃圾收集。默认值为 6700。

这里的“一些 Porcelain 命令”包括git push等等git fetch。所以如果最大打开文件限制< 6700,一旦你在单个 git repo 中获得 ~6700 个松散的对象ulimit -n,你最终会被阻止。git gc --auto

我很急。如何解决?

如果你有足够的权限调整系统ulimit:

$ sudo ulimit -n 8192

否则,您可以git gc通过设置禁用git config gc.auto=0,以便您可以将本地提交推送到远程,删除存储库,然后将其克隆回来,而不会出现成千上万的松散对象。

我们怎样才能防止这种情况再次发生?

Set git config --global gc.auto=200,其中 200 比您的最大打开文件限制小一些。如果你选择的值太小,git gc会运行太频繁,所以要明智地选择。

如果设置,除非您手动gc.auto=0运行,否则将永远不会打包松散的对象。git gc因此,同一目录中可能会累积数十万个文件,这可能是一个问题,尤其是对于机械硬盘驱动器或 Windows 用户而言。(另请参阅:一个目录中有多少文件太多?以及 在同一个 Linux 目录中有数百或数千个文件是否可以(性能方面)?)。

于 2021-02-22T12:31:32.400 回答