vscode 本身和 git 插件均不检测新增代码重复,真正有效的是语义重复检测插件(如 codemirror duplicate finder)结合 git 范围限定;需手动聚焦新增/修改文件区域扫描,或通过 pre-commit 钩子调用 simian 等工具实现自动化增量检测。

VSCode 本身不检测新增代码重复,Git 插件也不干这事;真正起作用的是「语义重复检测插件 + Git 范围限定」的组合用法。
为什么 Git 插件单独无法查重复
GitLens、GitHub Pull Requests 等 Git 相关插件只负责展示变更(diff)、标注作者、跳转 commit —— 它们输出的是「哪些行变了」,但完全不分析「变的这些行是否和其他地方逻辑重复」。所谓“检测新增重复”,本质是:在 git diff 所标识的新增/修改代码块中,运行一次语义相似度扫描。
- Git 插件不会重写变量名、归一化缩进、忽略注释差异,所以没法判断
axios.post('/api/user', data)和fetch('/api/order', { body: payload })是同类调用 - 你右键某次 commit → “Show Changes”,看到高亮的新增代码 —— 这只是文本快照,不是可分析的 AST
- 如果真想查“这次 PR 新增的代码里有没有和老代码重复”,得手动把 diff 内容复制出来,再喂给重复检测工具
CodeMirror Duplicate Finder 如何配合 Git 使用
它不直接读 Git 变更,但你能用它「只扫新增文件 + 修改区域附近代码」,大幅缩小误报范围:
在 OpenClaw 中管理 GitHub 仓库、Pull Request、Issue 与工作流。适用于审查 PR、管理 Issue、自动化 GitHub Actions、同步仓库等场景。
- 先用
git status --porcelain或 GitLens 的「Uncommitted Changes」视图,确认哪些文件被新增/修改 - 打开这些文件,在编辑器内右键 →
Find Duplicates in File(不是 Workspace)—— 避免扫到无关旧代码干扰结果 - 重点看高亮块是否横跨「新增行」和「已有函数体」:比如你在
utils/request.ts新增了一个postJson函数,而插件标出它和已有的putJson有 7 行相似 —— 这就是典型新增重复 - 若项目启用了
duplicate-finder.includeStrings: true,还能发现模板字符串里藏的重复日志拼接逻辑(常见于新增的错误处理分支)
真正能自动化“查新增重复”的方案只有命令行 + Git 钩子
想让重复检测绑定到提交前(pre-commit),必须绕过 VSCode GUI,走底层流程:
- 用
git diff --name-only HEAD获取本次变更文件列表 - 用
simian(支持 Java/JS/TS/Python)跑增量扫描:simian -includes="**/*.ts" -excludes="node_modules/**" $(git diff --name-only HEAD | tr '\n' ' ') - 把 simian 输出解析成 VSCode 可识别的 problem matcher 格式,或直接写入
.vscode/tasks.json作为自定义 task - 注意:simian 默认对空格/换行宽容,但不处理变量名替换 —— 所以它比 CodeMirror Duplicate Finder 更适合抓「结构微调但逻辑雷同」的新增重复
容易忽略的关键点
很多人以为开了 GitLens 就能自动标红重复,其实最常漏掉的是三件事:
- 插件扫描范围受
files.exclude和search.exclude影响 —— 如果你新增的文件在"src/generated/**"下,而该路径被排除了,那再准的算法也扫不到 -
duplicate-finder.minLines设为 8 时,新增的 5 行钩子函数(如useAuth)根本不会触发检测,必须调低到 4–5 - Git diff 显示的「+」行如果被包裹在 JSX 或带换行的模板字符串里,CodeMirror Duplicate Finder 默认跳过 —— 必须开
duplicate-finder.includeStrings: true,且确保文件编码是 UTF-8(BOM 会破坏解析)










