旧项目代码重复检测需用语义感知插件而非简单搜索;codemirror duplicate finder须调低minlines至5、similaritythreshold至75,并开启includestrings;git历史查重前需确认.git存在、分支正常、文件已add;变体重复需结合关键词搜索、diff比对及simian扫描,最终合并决策依赖人工判断。

旧项目代码重复检测不能靠 Ctrl+Shift+F 猜,必须用语义感知型插件;历史代码查重则要区分 Git 提交记录和本地快照,两者机制完全不同。
CodeMirror Duplicate Finder 配置不调就等于没装
默认设置 duplicate-finder.minLines: 8 和 duplicate-finder.similarityThreshold: 85 在老项目里基本失效:小工具函数、React Hook 逻辑常只有 4–6 行;变量名一换(data vs payload)相似度就掉到 70 以下。
- 把
duplicate-finder.minLines改成5,覆盖大多数钩子、校验、日志封装块 - 把
duplicate-finder.similarityThreshold降到75,容忍参数名/空格/注释位置差异 - 若重复藏在 JSX 或模板字符串里,必须开
duplicate-finder.includeStrings: true - 检查
.gitignore是否排除了src/utils/**或lib/—— 插件扫不到被 ignore 的路径
Git 历史里查重复?先确认你看到的是真历史
右键文件点 “View File History” 却一片空白,大概率不是插件问题,而是 Git 上下文缺失:
- 左下角状态栏没显示分支名(如
main)→ 检查是否用File → Open Folder打开了整个项目,而不是单个文件 -
git rev-parse --git-dir在终端返回错误 → 项目根目录缺.git文件夹 - 点了提交却只看到 Overview 标签,没 Diff → 手动点顶部的
Diff标签;若仍为空,运行git show HEAD:src/api/client.js看能否输出文本,排除 BOM 或编码混用 - 新文件没
git add过 → Timeline 里只显示灰色 “Local History”,且不持久,30 天后自动清理
“变体重复”根本没法自动标出,得换策略
插件对这类情况完全无响应:两个函数仅差一个参数名、一个用 for (let i = 0; i 另一个用 <code>arr.forEach()、同一段逻辑被拆进两个 if 分支、或只改了一个超时值(5000 → 10000)。
- 先用
Ctrl+Shift+F搜共性关键词,比如axios.post、localStorage.setItem、catch (err) - 把搜索结果中前 3–4 个疑似块复制进 diffchecker.com 快速比对结构
- 对跨文件、缩进混乱的场景,用命令行
simian扫一次:simian -includes=**/*.js -threshold=80,它比插件更宽容空格和换行
真正难合并的从来不是“长得像”的代码,而是“业务上该合但写法已发散”的逻辑——工具只能帮你从 200 个文件缩到 5 个,剩下那步抽成公共函数、加类型守卫、还是保留差异,得你对着需求文档拍板。











