duplicate group name 这条报错很直白:Clash Verge Rev 交给 Mihomo 的最终配置里,出现了两个同名策略组。它通常和测速、延迟、节点数量无关。
Clash Verge Rev 的扩展分两种:YAML 形式的 Merge,以及 JavaScript 形式的 Script。它们又分全局和 Profile 两个作用范围。官方文档里的生效顺序是:全局扩展配置、全局扩展脚本、订阅扩展配置、订阅扩展脚本。
先关哪一个扩展?
| 现象 | 更可能原因 | 先做什么 |
|---|---|---|
| 关闭全部扩展后正常 | 扩展写入了重复组 | 逐个启用 4 类扩展 |
| 只开全局脚本就报错 | 全局 Script 里 push 了同名组 | 查 config["proxy-groups"] |
| 只在某个 Profile 报错 | Profile 扩展和原订阅冲突 | 看该 Profile 绑定的 Merge / Script |
| 同一个脚本绑了两处 | 全局和 Profile 都执行它 | 取消其中一个绑定 |
GitHub issue #3256 里有一个典型现场:同一个 Script.js 既作为全局脚本,又在 Profile 的 option.script 里指定。脚本执行两遍,新增策略组也被写了两遍。
Script 到底在改什么?
官方 Script 文档写明,脚本语言是 JavaScript,执行器是 boa_engine,入口函数是 main。
最小脚本长这样:
function main(config) {
return config;
}
v1.7.3 以后可以拿到 Profile 名称:
function main(config, profileName) {
if (profileName === "work") {
// 只改 work 这个 Profile
}
return config;
}
这里的 config 是配置对象。脚本适合改 rules、proxy-groups、rule-providers 这类字段,不适合临时下载远程规则;文档也说明它不支持网络 IO 和文件 IO。
push 前有没有查重?
最容易出错的是无条件 push:
function main(config) {
config["proxy-groups"].push({
name: "日本手动",
type: "select",
proxies: ["DIRECT"]
});
return config;
}
脚本只执行一次时看不出问题;同一脚本被全局和 Profile 各跑一次,或者被重复绑定一次,就会生成两个 日本手动。
改法是先查名字:
function main(config, profileName) {
const groups = config["proxy-groups"] || [];
const name = "日本手动";
if (!groups.some((g) => g.name === name)) {
groups.push({
name,
type: "select",
proxies: ["DIRECT"]
});
}
config["proxy-groups"] = groups;
return config;
}
如果你按地区、倍率、用途生成多个组,先把候选组名放进数组,再统一去重。不要在几个函数里分散 push 同一批名字。
Merge 和 Script 怎么分开测?
Merge 是 YAML,适合固定字段覆盖和补规则。Script 是 JavaScript,适合按 Profile 名称、节点名称或正则动态改配置。两者一起开着排错,很容易误判。
按这个顺序做:
- 右键 Profile,进入「编辑扩展/脚本」。
- 关闭全局扩展配置和全局扩展脚本。
- 关闭该 Profile 的订阅扩展配置和订阅扩展脚本。
- 应用原订阅,确认不报错。
- 只打开一个扩展,应用一次配置,记录第一次报错的文件名。
找到文件后,搜这些词:
proxy-groups
push
name:
include-all
use
Mihomo 文档里,proxy-groups.name 是策略组名字,proxies 引用节点或其它策略组,use 引用 provider 名称。名字不一致会导致组为空;名字重复会触发 duplicate。
怎么确认最终 YAML 没重复?
UI 里的订阅文件不一定等于最终运行配置。Merge 和 Script 处理后,运行时配置可能已经被改过。
在 Clash Verge Rev 里导出当前生效配置,然后搜索目标组名:
grep -n "name: 日本手动" current.yaml
grep -n "proxy-groups:" current.yaml
一个策略组名只应该出现一次作为 name:。规则里多次引用它没有问题,那不是重复定义。
什么时候别继续改订阅?
原订阅在关闭扩展后能应用,说明订阅本体大概率没坏。继续换核心、换订阅,只会把变量变多。先把现场压到最小:一个 Profile、一个扩展文件、一个新增策略组。
多设备共用同一份 Profile 时,可以保留一份兼容 Clash / Singbox / V2Ray 的订阅当输入基线;但 duplicate group name 仍然要从本机扩展顺序查起,不要把它当成订阅服务端故障。
相关阅读
FAQ
duplicate group name 是节点重复吗?
通常不是。这个错误指策略组名称重复,常见原因是 Merge 或 Script 重复插入同名 proxy-groups,和节点显示名重复不是同一层。
Clash Verge Rev 的 Script 入口函数是什么?
官方文档写的是 JavaScript main 函数,基础形式是 function main(config) { return config; },v1.7.3 起也可以接收 profileName。
为什么只在某个 Profile 变红?
订阅扩展只作用于当前 Profile。若全局脚本正常、某个 Profile 启用后报错,重点看该 Profile 绑定的扩展文件和组名引用。
怎么防止脚本重复 push?
push 前用 some(g => g.name === '组名') 判断是否已存在。存在就跳过,避免同一脚本被全局和 Profile 各执行一次。
来源与时间戳
最后核对:2026-05-22。依据 Clash Verge Rev 扩展配置文档、Script 文档、GitHub issue #3256 和 Mihomo proxy-groups 文档;错误现场以导出的当前生效配置为准,不以原订阅文件为准。