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

Don*_*Joe 19 visual-studio-code

我刚开始使用VSCode.

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

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

在我按照指南中的建议检查限制后 ,使用

cat /proc/sys/fs/inotify/max_user_watches
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_* An 11

你没有手表的事实并不意味着它VSCode的错。

VSCode 从手表中排除目录肯定有问题(在Linux上)。

但是由于您自己计算了文件,因此这种情况下的错误消息可能具有误导性,并且其他一些应用程序已经耗尽了 watch

要跟踪有罪的应用程序,您可以使用这个不错的脚本


小智 8

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

将此行添加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
  }
Run Code Online (Sandbox Code Playgroud)

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

  • 我的项目只有 650 个文件(其中 400 个在 .git 中),所以我认为这不是可接受的解决方案。 (3认同)
  • 如果[这个持续存在的错误](https://github.com/microsoft/vscode/issues/40898)不存在,编辑“files.watcherExclude”将是一个很好的解决方案。我敢打赌它会在那里呆很长时间.. (2认同)

San*_*ues 7

在我的情况下,我没有足够的权限来更改sysctl.conf,所以我的 Ubuntu 18.04 LTS 解决方案是:

sudo /bin/su -c "echo 'fs.inotify.max_user_watches=524288' >> /etc/sysctl.conf"
sudo sysctl -p
Run Code Online (Sandbox Code Playgroud)

  • 当您可以使用“sudo”并将文本附加到文件时,您没有权限更改“sysctl.conf”,这是什么意思?:) (7认同)

And*_*ico 7

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

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

  5. 输入:wq!并输入

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

  • 对于没有vim的人,请尝试`sudo nano / etc / sysctl.conf`,然后执行第4步,然后按ctrl + x代替`:wq!`,单击y并输入 (2认同)

wor*_*ise 7

以下设置对我有用(在内部.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
}
Run Code Online (Sandbox Code Playgroud)

.git, node_modules默认情况下可能会排除这些内容,但根据您的工作空间,您可能需要添加其他内容。举个例子,我有一个到文件系统中更高级别目录的软链接(该目录递归地包含数百个或数千个文件)。同样,.cache-loader通常有数千个文件。

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

一些理论观点:这里的大多数答案(甚至在官方 vscode 文档中)都建议将系统观察程序限制增加到一个非常大的数字。这在大多数情况下都可以工作,但是,就像使用锤子代替螺丝刀一样(是蛮力,可能并不总是有效,而且效率不高)。虽然绝对系统限制可以(也许应该)从默认限制提高,但它有利于优化您的工作空间并避免使用不必要的系统资源。


Har*_*esh 6

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

通过编辑/etc/sysctl.conf并将此行添加到文件末尾,可以将限制增加到最大值:fs.inotify.max_user_watches=524288

然后可以通过运行加载新值 sudo sysctl -p


Ahm*_*ail 6

在我的情况下(使用 Composer 的 PHP),我不得不vendor从观看中排除路径

在此处输入图片说明

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


Von*_*onC 5

2021 年 10 月:这是对 VSCode 1.61 的改进(2021 年 9 月,见下文)

VSCode 1.62 包括:

文件观察变化

VS Code 中的文件监视更改为新库,这要归功于 Parcel 团队及其@parcel/watcher.
我们将在接下来的几周内逐步向所有用户推出此更改。
Linux 用户将会很高兴地了解到,files.watcherExclude现在原生应用,这样 VS Code 需要打开文件观看的文件句柄数量就可以大大减少。

现有files.legacyWatcher设置已更改为具有以下值的枚举:

  • on- 新的文件观察器将永远不会被使用。
  • off- 新的文件观察器将始终被使用。
  • default- 新的文件观察器仅在您打开多根工作区(通过文件)时使用.code-workspace

2021 年 2 月:如问题 40898中所述,多根工作区仍然存在该问题(请参阅最后一部分,了解 VSCode 1.61 的改进)

最初的问题是,npm当 VSCode 运行时,安装所需的时间是安装依赖项的两倍。

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

我使用以下组合(但似乎没有一个有效):

"files.watcherExclude": {
       "**/node_modules": true,
       "**/node_modules/**": true,
       "**/node_modules/*/**": true
   }
Run Code Online (Sandbox Code Playgroud)

评论指出了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;
}
Run Code Online (Sandbox Code Playgroud)

2021 年 9 月更新,来自Lionel Gatibelza

我能够解决这个问题,我不知道真正的原因以及为什么 Vscode 执行此错误检查,但我在远程服务器和本地计算机上进行了已知的修复:

  • 将其添加fs.inotify.max_user_watches=524288/etc/sysctl.conf
  • 重新加载配置:sudo sysctl -p
  • 关闭并重新打开 vscode 之后我就没有再出现错误了!

来自Benjamin Pasero(苏黎世 Microsoft 软件工程师)的第 132483 期:

澄清一下,nsfw它也用于 Windows 以及多根工作区。
我们 5 年前的初衷是用它来取代所有其他观看解决方案nsfw,因此我们仅针对多根场景启用它,该场景针对较低的用户群(可能是 200.000 个用户)以获得一些测试和反馈。
此旅程的下一步是为所有用户启用它并删除其他用户。

PS:当前默认情况下未启用的唯一平台nsfw(除非您位于多根工作区中)是Linux,因为不幸的是nsfw不支持忽略模式(我们的files.watcherExclude设置),并且层次结构中的每个文件夹都被视为打开的文件句柄操作系统中有限的文件句柄集,迫使用户增加该限制。
计划在 10 月份实施该支持,然后再加入 Linux。


2021 年 9 月,VSCode 1.61:

文件观察变化

用于检测磁盘上文件和文件夹更改的文件观察器已更改为可以处理我们所有支持的平台(Windows、Linux、macOS)的库,并减少了为不同平台维护不同观察器的开销。

我们计划在所有平台上默认启用该库。这次迭代我们在 Windows 和 macOS 上启用了它,而 Linux 也在不久之后计划。

新的观察程序启动速度应该更快,从而减少花在大型文件夹上的 CPU 周期。

使用该库的一个缺点是文件观察器不再自动检测工作区中 macOS 上符号链接的文件夹。
如果您有这样的设置,则可以使用新files.watcherInclude设置添加符号链接路径以明确包含文件监视。

从好的方面来说,您可以在 Windows 上使用此新设置在工作区中显式包含符号链接文件夹 - 这在 Windows 上以前是不可能的。

您应该不会注意到日常工作有任何差异,但如果您的文件监视出现问题,请报告问题。
有一个设置files.legacyWatcher可以在出现问题时启用旧观察程序。