VSC无法在这个庞大的工作空间中观察文件更改

时间:2018-06-17 22:59:07

标签: visual-studio-code

我刚开始使用VSCode版本1.24.1。

加载文件夹后,会显示警告

  

Visual Studio Code无法在此大型工作区中查看文件更改

按照guide的建议检查限制后,使用

cat /proc/sys/fs/inotify/max_user_watches

我得到8192,而我的项目只有650个文件(其中400个在.git内)

为什么会这样?这是一个错误还是我错过了什么?

(增加限制显然不是正确的解决方案。)

12 个答案:

答案 0 :(得分:8)

您不在场的事实并不意味着其VSCode的错。

VSCode确实存在从watch(在Linux上)中排除目录的问题。

但是,由于您自己计算了文件数量,因此在这种情况下,错误消息可能会引起误解,并且其他一些应用程序已经用尽了手表

要跟踪有罪的应用程序,可以使用this nice script

答案 1 :(得分:2)

我找到的对我有用的解决方案是

将此行fs.inotify.max_user_watches=524288添加到/etc/sysctl.conf

然后运行命令sudo sysctl -p

然后转到您的vscode设置,找到名为settings.json的文件

和这行

"files.watcherExclude": {
    "**/.git/objects/**": true,
    "**/.git/subtree-cache/**": true,
    "**/node_modules/*/**": true
  }

您也可以引用此链接https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc

答案 2 :(得分:2)

就我而言(使用Composer的PHP),我不得不从观看中排除vendor路径

enter image description here

根据您的情况,应排除依赖项文件夹。

答案 3 :(得分:2)

以下对我有用的设置(在.vscode/settings.json中,您也可以将它们置于vscode中的用户级别/系统级别设置,而不是工作空间级别设置)

"files.watcherExclude": {
        "**/.git": true,
        "**/.DS_Store": true,
        "**/node_modules": true,
        "**/some-soft-link-to-higher-level-directory-in-my-file-system" : true,
        "**/.cache-loader" : true
}
默认情况下,可能会排除

.git, node_modules,但是根据您的工作空间,您可能需要添加其他内容。例如,我有一个软链接到文件系统中的一个更高级别的目录(递归地有数十万个文件)。同样,.cache-loader通常具有数千个文件。

可能有用的注释:我花了一些时间才意识到files.excludefiles.watcherExclude是两个不同的设置。

一些理论观点:此处的大多数答案(甚至在正式的vscode文档中)都建议将系统监视程序的限制增加到非常大的数目。在大多数情况下,这可以正常工作,但是,就像用锤子代替螺丝起子一样(蛮力,可能并不总是有效,并且效率不高)。尽管可以(可能应该)从默认限制中提高绝对系统限制,但是优化工作空间并避免使用不必要的系统资源是有益的。

答案 4 :(得分:1)

TL; DR;

好像是内存泄漏。

-----

现在似乎警告已经消失了。

不幸的是我现在无法重现这个错误,但这里有一些步骤。

  • 已安装Php Intellisense扩展程序
  • 来自linux终端git init
  • 将文件夹添加到工作区
  • 是否有一些工作,添加,保存,提交和推送命令面板
  • 关闭VSC
  • 打开VSC - >警告已经显示出来。

此时我在htop中看到有一个进程/usr/share/code,其中包含TypeScript使用100%1 CPU和1G RAM的长参数。然后

  • 关闭VSC
  • 杀死进程
  • 打开VSC

现在警告不再显示,CPU也正常使用。

答案 5 :(得分:1)

如果用于 JavaScript 开发,则有一种解决方法:

只需禁用此内置扩展名: TypeScript和JavaScript语言功能

TypeScript and JavaScript Language Features

答案 6 :(得分:1)

issue 40898 中所述,该问题对于多根工作区仍然存在

<块引用>

最初的问题是,当 vscode 运行时,npm install 需要两倍的时间来安装依赖项。

我发现这是因为文件监视 node_modules 文件夹,所以我将它添加到 files.watcherExclude

我使用以下组合(但它们似乎都不起作用):

"files.watcherExclude": {
       "**/node_modules": true,
       "**/node_modules/**": true,
       "**/node_modules/*/**": true
   }

comment 指出 a script 中的 Dirk Feytons 以查看实际创建了哪些 inotify 监视,以确认是否正在使用我的观察者排除项。

/*
 * If you want to see which inotify watches are being created by an application then you can
 * use this simple piece of code, compile it to a shared library and LD_PRELOAD it when starting
 * the application. Keep an eye on syslog to see the list of watches.
 * **NOTE**: this only logs the watches, it won't actually create the watch and thus watching
 * for changes WON'T actually WORK!
 *
 * More details (adjust as needed for your environment/distribution):
 * - Save this file in e.g. $HOME/inotify.c
 * - Compile: gcc -shared -o inotify.so inotify.c
 * - Start monitoring syslog: tail -f -n 0 /var/log/syslog | tee $HOME/watches.log
 * - Run your application with: LD_PRELOAD=$HOME/inotify.so <application>
 */

#include <sys/inotify.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>

int inotify_add_watch(int fd, const char *pathname, uint32_t mask)
{
    syslog(LOG_USER | LOG_ERR, "********** [%u] inotify_add_watch for %s", getpid(), pathname);
    return 100000;
}

答案 7 :(得分:0)

这是解决方法:https://code.visualstudio.com/docs/setup/linux

可以通过编辑/etc/sysctl.conf并将此行添加到文件末尾来将限制增加到最大:

fs.inotify.max_user_watches = 524288 然后可以通过运行sudo sysctl -p

来加载新值。

答案 8 :(得分:0)

就我而言,我没有足够的特权来更改sysctl.conf,因此我针对Ubuntu 18.04 LTS的解决方案是:

sudo /bin/su -c "echo 'fs.inotify.max_user_watches=524288' >> /etc/sysctl.conf"
sudo sysctl -p

答案 9 :(得分:0)

Linux ppl不知道什么,像我这样对Linux有新的ppl。因此,如果您是菜鸟,这是给您的。

  1. cat /proc/sys/fs/inotify/max_user_watches(可能是8k以上的数字)
  2. sudo vim /etc/sysctl.conf
  3. 一直往下走,并添加以下行:fs.inotify.max_user_watches=524288(确保不要在命令前加上#

  4. 键入:wq!并输入

  5. 键入sudo sysctl -p
  6. 再次输入:cat /proc/sys/fs/inotify/max_user_watches(现在应该超过500k)
  7. 稍后再感谢我。

答案 10 :(得分:0)

帮助我为正在从事的项目创建一个单独的工作区的是什么。因此,如果我正在/ htdocs / project /中进行操作,则不只是打开该文件夹,而是将其创建为工作区。

答案 11 :(得分:0)

如果您正在编写 JavaScript ,则可能可以解决此问题:

您必须访问侧边栏扩展菜单: Ctrl + Shift + X
然后输入:@builtin types禁用扩展名:TypeScript and JavaScript language features