Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么git在使用“push/fetch”时失败;“打开的文件太多”;_Linux_Git_Config - Fatal编程技术网

Linux 为什么git在使用“push/fetch”时失败;“打开的文件太多”;

Linux 为什么git在使用“push/fetch”时失败;“打开的文件太多”;,linux,git,config,Linux,Git,Config,我在Git中遇到了一个问题,我收到了以下消息: > git fetch error: cannot create pipe for ssh: Too many open files fatal: unable to fork 系统管理员增加了我的文件限制,但没有纠正该问题。此外,我不存在使用vi创建新文件的问题 在尝试推送新分支时,我会收到类似的消息: git推送原点测试\u此\u已损坏\u git 错误:无法创建管道:打开的文件太多 致命:发送包:无法分叉边带解复用器 有人能确切地回答

我在Git中遇到了一个问题,我收到了以下消息:

> git fetch
error: cannot create pipe for ssh: Too many open files
fatal: unable to fork
系统管理员增加了我的文件限制,但没有纠正该问题。此外,我不存在使用vi创建新文件的问题

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

git推送原点测试\u此\u已损坏\u git 错误:无法创建管道:打开的文件太多 致命:发送包:无法分叉边带解复用器


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

有两条类似的错误消息:

EMFILE: Too many open files ENFILE: Too many open files in system 因此,在我的系统中,单个进程中打开的文件限制为1024个。您不需要询问系统管理员(请不要使用首字母缩写SA,它太不透明;如果必须缩写,请使用“sysadmin”)来提高限制

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

这可能是Git或库中的一个bug,也可能是您正在使用某个东西的旧版本,也可能是更奇怪的东西。首先尝试
strace
查看它打开了哪些文件,并检查Git是否关闭了这些文件

来自Hazok的更新:

使用上述建议后,发现错误是由过多松散物体引起的。有太多松散的对象,因为没有足够频繁地运行
git gc

为什么会发生这种情况? 发件人:

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

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

我赶时间。如何修复它? 如果您有足够的权限调整系统ulimit:

$ sudo ulimit -n 8192
否则,您可以通过设置git-config-gc.auto=0禁用git-gc,这样您就可以将本地提交推送到远程,删除repo,并将其克隆回来,而不需要数千个松散对象

我们怎样才能防止这种情况再次发生? 设置git config--global gc.auto=200,其中200是小于最大打开文件限制的值。如果选择的值太小,
git gc
将运行得太频繁,因此请明智地选择


如果设置了
gc.auto=0
,则松散对象将永远不会打包,除非手动运行
git gc
。因此,在同一个目录中可能会积累数十万个文件,这可能是一个问题,尤其是对于机械硬盘或Windows用户。(另请参见:和)。

谢谢您的解释和提示。我没有向SAs提出请求,他们仍在试图找出根本原因,时间太长了,所以我想看看Stackoverflow上的专家们的建议:D我尝试了strace,它正在倾倒大量的统计数据,lstat,open,read,read,关闭每个标签上的命令。我是否介意编辑您的答案,并在其中提供最终原因和解决方案?我想给你充分的信任,因为这是一个Git的问题,运行strace帮助了很多。
$ sudo ulimit -n 8192