Cursor IDE 状态与磁盘不同步

AI 改完后编辑器还显示旧内容,或保存时提示「文件已被外部修改」——文件 watcher 和 AI 写入的竞态。

AI 编辑直接写磁盘,编辑器的 file watcher 一般立刻感知并刷新视图。但大文件、远程文件系统(WSL/Docker volume)、AV 拦截、auto-save 撞上 apply 这几种场景里,编辑器和磁盘会短暂”看到不同的世界”。表现是你看到的还是旧代码、同事 / AI 回复里却已经在引用新代码;保存时弹”file has been modified externally”;或一个 split pane 是新的另一个是旧的。

修这类问题不是简单 Cmd+S 覆盖——盲目覆盖会用旧 buffer 把 AI 改的内容盖回去。

常见原因

1. File watcher 漏掉了 AI 的写事件

macOS FSEvents / Linux inotify / Windows ReadDirectoryChangesW 在高负载或网络挂载下会丢事件。Cursor 内部 watcher 也有节流。AI 改完磁盘是新的、编辑器没收到通知不刷新。

如何判断:终端 cat file.ts 看到新内容,编辑器里还是旧的——就是 watcher 没听到。

2. 编辑器 buffer 有未保存改动 + 磁盘被 AI 写

文件 tab 上有圆点(脏 buffer),同时 AI 改了磁盘。Cmd+S 把 buffer 写回去 = 覆盖 AI 改动。Cursor 通常会弹冲突提示,但有时静默赢家是 buffer。

如何判断:apply 前 / 后看 tab 圆点;apply 时 tab 有圆点就是危险信号。

3. 同文件被 split pane 打开两份

VS Code/Cursor 允许一个文件在两个 pane 显示,但每个 pane 有独立 view model。AI 写完后 pane A 刷新了、pane B 没刷(因为它最近没被聚焦)。

如何判断:两个 pane 显示同一文件、但内容不一致。

4. WSL / Docker volume / 网络盘文件事件延迟

/mnt/c/...(WSL 跨边界)、Docker macOS osxfs 卷、SMB/NFS 网络挂载、Dropbox/iCloud 同步目录——文件事件可能延迟 5-30 秒甚至完全丢。

如何判断:项目路径在以上之一;同样的 AI 操作在原生路径不复现。

5. Auto-save 撞上 apply

Cursor files.autoSave: afterDelay 在 1 秒后写脏 buffer。Composer apply 正好在那一瞬写完,编辑器没刷新就用旧 buffer 覆写。

如何判断:Settings → files.autoSave 不是 “off”;问题发生时间和 auto-save delay 接近。

6. AV / 文件锁短暂占用

Windows Defender、企业 AV、Spotlight 索引、Time Machine 备份扫描偶尔短暂锁文件 200-500ms,刚好 fall 在 watcher 节流窗口。

如何判断:问题间歇性、和 AV 扫描时段相关。

动手前先确认

  • 确认问题是只在某些文件 / 某些时段 / 某些项目里出现,还是普遍现象。
  • 复现前先 commit 一次,确保如果 revert 出错有 baseline 可救。
  • 记下 Cursor 版本和文件系统类型(macOS APFS、WSL ext4、Docker volume、SMB)。

需要收集的信息

  • Cursor 版本、操作系统、文件系统类型。
  • 项目路径(是否在 WSL /mnt/、Docker volume、网络盘、iCloud 同步目录)。
  • files.autoSave 设置、是否多 pane 同文件打开。
  • View → Output → Log (Window) 看 watcher 是否有 “missed event” / “throttled” 类日志。

最短修复路径

按”先救当前文件 → 后改防再犯”。

Step 1:先存 buffer 再 reload

如果当前文件 tab 有圆点(脏 buffer),先 copy 全文到外部 scratch 文件:

# macOS:选中全部 → Cmd+C → 终端
pbpaste > /tmp/scratch-backup.ts

然后 Cmd+Shift+P → “Revert File”,编辑器丢 buffer、重读磁盘。再决定要不要把 scratch 内容合并回来。

Step 2:全局不一致就 reload window

Cmd+Shift+P → “Developer: Reload Window”,整个 Cursor 重新加载所有文件、watcher 重建。比退出 Cursor 快。

Step 3:关 auto-save,至少 AI session 期间

Settings → 搜 files.autoSave → 改成 offonFocusChange。AI 改完后手动 Cmd+S,避免 buffer 抢写。

// settings.json
{
  "files.autoSave": "off",
  "files.hotExit": "onExit"
}

Step 4:同文件不要 split pane

把第二个 pane 关掉,或者用”split editor right”的 mirror 模式而不是独立 view。Cmd+Shift+P → “View: Close Other Editor Group”。

Step 5:项目从 /mnt/c 搬到 WSL 原生

WSL2 下 /mnt/c/Users/you/repo 跨文件系统边界,watcher 极慢。git clone~/repo 这种 WSL 原生路径,速度和事件可靠性都跳一个量级。

Docker macOS 同理,把 volume 改成 cacheddelegated mount,最好整个项目放容器内。

Step 6:AV 加白名单

Windows Defender / 企业 AV → 排除目录列表加你的项目根 + Cursor 安装目录。macOS Spotlight:

sudo mdutil -i off ~/path/to/repo

或 System Settings → Spotlight → Privacy 加入。

怎么确认已经修好

  • 重启 Cursor 后再触发一次原操作,确认不是会话内的临时状态。
  • 切换到另一个仓库 / 另一台机器复现,区分是 Cursor 配置问题还是项目本身问题。
  • 让同事打开同一个仓库重试,确认不是只有你的本地缓存被修好。

如果还是没修好

  • 把复现路径缩到最小:单文件、单次 AI apply、auto-save 关。
  • 回滚最近一次 Cursor 升级或 settings.json 改动。
  • 在 forum.cursor.com 搜 “file watcher missed” / “out of sync”;附 OS + 文件系统类型。
  • 抓 View → Output → Log (Window) 贴 Bug Reports。

预防建议

  • AI 编辑期间 auto-save 关掉,结束后再开。
  • 同文件不开 split pane;要对比就用 git diff / source control 视图。
  • 项目永远放原生文件系统:macOS APFS、WSL ext4、Linux 本地盘。
  • 把 Cursor 安装路径和项目根加进 AV / Spotlight 白名单。
  • 重要 AI session 前后各 commit 一次,最坏情况一行 git reset --hard 救回。

相关阅读

标签: #排查 #Cursor #排查 #IDE 同步