我遇到了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没有经常运行.
来自git 文档:
当存储库中的松散对象大约超过这么多时, git gc --auto 将打包它们。一些 Porcelain 命令使用此命令不时执行轻量级垃圾收集。默认值为 6700。
这里的“一些 Porcelain 命令”包括等等git push。git 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 目录中拥有数百或数千个文件是否可以(性能方面)?)。
| 归档时间: |
|
| 查看次数: |
6583 次 |
| 最近记录: |