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 是配置对象。脚本适合改 rulesproxy-groupsrule-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 名称、节点名称或正则动态改配置。两者一起开着排错,很容易误判。

按这个顺序做:

  1. 右键 Profile,进入「编辑扩展/脚本」。
  2. 关闭全局扩展配置和全局扩展脚本。
  3. 关闭该 Profile 的订阅扩展配置和订阅扩展脚本。
  4. 应用原订阅,确认不报错。
  5. 只打开一个扩展,应用一次配置,记录第一次报错的文件名。

找到文件后,搜这些词:

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 文档;错误现场以导出的当前生效配置为准,不以原订阅文件为准。