为什么git在使用"打开太多文件"的推送/获取时失败

Haz*_*zok 7 linux git config

我遇到了Git的问题,我收到以下消息:

> git fetch
error: cannot create pipe for ssh: Too many open files
fatal: unable to fork
Run Code Online (Sandbox Code Playgroud)

系统管理员已经增加了我的文件限制,但它没有更正问题.另外,我没有使用vi创建新文件的问题.

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

git push origin test_this_broken_git错误:无法创建管道:打开文件太多致命:send-pack:无法解除边带解复用器

有人可以回答为什么会发生这种情况吗?我没有对我的git配置进行任何最近的更改,并已手动验证.

Die*_*Epp 12

有两个类似的错误消息:

EMFILE: Too many open files
ENFILE: Too many open files in system

它看起来像你正在获得EMFILE,这意味着超过了单个进程的文件数.因此,检查是否vi可以打开文件是无关紧要的 - vi将使用自己独立的文件表.检查您的限制:

$ ulimit -n
1024

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

您可能希望通过运行Git来检查Git打开哪些文件strace.

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

来自Hazok的更新:

使用上述建议后,事实证明错误是由太多松散的物体引起的.松散的物体太多了,因为git gc没有经常运行.


Arn*_*e97 5

为什么会发生这种情况?

来自git 文档

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

这里的“一些 Porcelain 命令”包括等等git pushgit fetch因此,如果最大打开文件限制< 6700,一旦您在单个 git 存储库中获得约 6700 个松散对象,ulimit -n您最终将被阻止。git gc --auto

我很急。如何修复它?

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

$ sudo ulimit -n 8192
Run Code Online (Sandbox Code Playgroud)

git gc否则,您可以通过设置来禁用git config gc.auto 0,这样您就可以将本地提交推送到远程,删除存储库,然后将其克隆回来,而无需数千个松散对象。

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

设置git config --global gc.auto 200,其中 200 是小于最大打开文件限制的某个值。如果您选择的值太小,git gc则会运行太频繁,因此请明智选择。

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