打开一个稍微大点的项目,Cursor 状态栏永远停在 Indexing 5%,半小时也不动;或者 indexing 跑完了又自动重跑,整台 Mac 风扇拉满。90% 的情况不是 Cursor 卡死,而是它正在试图索引 node_modules/、dist/、.git/ 这些根本不该索引的目录——一个中型前端项目里这几个目录加起来轻松破百万文件,普通 SSD 也撑不住。这篇给出最快让 Cursor 跳过它们的 .cursorignore 模板、强制重建索引的步骤,以及如何确认索引真的健康了。
常见原因
按出现频率从高到低排序。
1. node_modules/ 没被排除
最常见。一个中型前端项目的 node_modules/ 通常 300k–800k 个文件,比你的源代码多两个数量级。Cursor 默认应该跳过,但偶尔会因为 workspace 配置异常或符号链接而把它算进来。
如何判断:find node_modules -type f | wc -l,若 > 100000 且 Cursor 状态栏长时间在 Indexing,几乎肯定是它。
2. 构建产物目录(dist/ / build/ / .next/ / .astro/)
热重载频繁的项目,构建产物每次都被刷新,Cursor 检测到文件变更就重新索引,进入”索引完→检测到变化→重索引”的死循环。
如何判断:开发服务器跑着的时候 Cursor 反复出现 Indexing,停掉 dev server 就稳定下来。
3. .git/ 对象目录
大仓库的 .git/objects/ 能有几十万个 pack 文件。Cursor 通常自动跳过,但克隆自镜像或带 LFS 的仓库偶尔会漏。
如何判断:du -sh .git/,若 > 500MB 且没显式 ignore,怀疑它。
4. 缓存与日志目录
.cache/、.turbo/、.vercel/、logs/、coverage/ 频繁写入,触发同样的死循环问题。
如何判断:Cursor 重新索引时,看 Activity Monitor 里它的磁盘读写排序,落在哪个目录上。
5. Monorepo 多子包产物全部命中
apps/web/.next、apps/api/dist、packages/ui/storybook-static 一起索引,几百万文件叠加。每个子包都得有自己的 .cursorignore,或者根目录写通配规则。
如何判断:find . -name dist -o -name .next -o -name build -type d,若返回 > 3 条且无 ignore 覆盖,就是。
最短修复路径
Step 1:写一份”通杀”的 .cursorignore
在项目根创建或编辑 .cursorignore:
# 依赖
node_modules/
# 版本控制
.git/
# 构建产物
dist/
build/
out/
.next/
.astro/
.svelte-kit/
.nuxt/
.output/
# 缓存
.cache/
.turbo/
.vercel/
.parcel-cache/
.pytest_cache/
__pycache__/
# 测试覆盖率
coverage/
.nyc_output/
# 日志与产物
*.log
*.lock
Monorepo 在每个子包里再放一份”局部” .cursorignore:
# packages/web/.cursorignore
.next/
.turbo/
Step 2:彻底重建索引
.cursorignore 修改不会自动重建——必须手动触发。
Cmd/Ctrl + Shift + P → "Cursor: Reset Index"
或更彻底(推荐用于死循环场景):
# 关掉 Cursor 后清缓存
rm -rf ~/Library/Application\ Support/Cursor/User/workspaceStorage/*/cursorIndex
# Linux:
rm -rf ~/.config/Cursor/User/workspaceStorage/*/cursorIndex
# 重新打开 Cursor
Step 3:等待并确认状态
重启 Cursor,重新打开项目:
- 状态栏先短暂显示
Indexing 0% - 1–3 分钟内跳到
Indexed(中型项目);大型 monorepo 5–10 分钟 - 若 10 分钟后仍未完成,回到 Step 1 检查是否漏了某个产物目录
打开 Settings → Features → Codebase Indexing 看 “Files Indexed” 数。健康的中型项目通常在 5k–30k;如果还在 100k+,ignore 还没生效。
Step 4:dev server 也对应做隔离
如果索引完了又被 dev server 触发重跑,把 dev 输出目录也加进 .cursorignore。Vite / Webpack 可以把 build output 放进单独的、已被 ignore 的目录:
// vite.config.ts
export default {
build: {
outDir: 'dist', // 已在 .cursorignore
},
cacheDir: '.cache/vite', // 已在 .cursorignore
}
预防建议
- 创建新仓库时第一件事就 commit
.cursorignore,模板和.gitignore同步维护 - 不要把缓存 / 构建产物目录放进项目根之外的奇怪位置;统一在根
- monorepo 在每个子包都加
.cursorignore,不要指望根目录的通配能覆盖所有变体 - 装新依赖、改 build 工具或加新生成器后,主动 Reset Index 一次,别等死循环
- dev server / hot reload 频繁写入的目录(
.cache/、.turbo/),永远 ignore