切换供应商后 settings.json 插件与 hooks 丢失
Quick fix
这是 cc-switch 的全量快照覆盖设计:把需要保留的字段放进“共享配置片段 / 通用配置”,并勾选“写入通用配置”。
Symptom
Section titled “Symptom”切换模型时, 会重写settings.json的Key, 但是有时候会丢失settings.json的其他Key, 写入时应该和原本settings.json中Key合并, 并且合并时应该实时获取原始配置.cc-switch 切换供应商时并不是只合并或替换 env / 模型相关字段,而是把目标供应商在数据库中保存的完整 settings.json 快照整体写回 ~/.claude/settings.json。因此插件配置、enabledPlugins、hooks、includeCoAuthoredBy 等字段如果只存在于当前 live 文件里,而没有进入共享配置片段 / 通用配置,切换到另一个供应商时就可能被覆盖或看起来“随机丢失”。维护者说明这是有意设计,因为字段级 merge 曾带来嵌套数组、用户删除字段与未设置字段难以区分、多层合并冲突等边界问题。
该 cluster 中还混有其他相关现象:部分用户报告“切换失败,请检查配置”,维护者提到常见原因包括配置格式不正确或 cc-switch 对 settings.json 没有写入权限;另有用户提到开启代理接管时通用配置可能未能正确写回,维护者称已在 v3.12.2 修复;还有用户反馈切换后对话不保留,维护者解释这是 Claude Code / Codex 客户端在 env 变化后重新初始化会话,cc-switch 不删除会话。
打开 cc-switch 的“编辑供应商 / Edit Provider”,进入“共享配置面板 / Shared Config Panel”。
点击“从当前供应商提取 / Extract from Current Provider”,把 enabledPlugins、hooks、statusLine、includeCoAuthoredBy 等需要跨供应商保留的字段提取到共享配置片段 / 通用配置中。
~/.claude/settings.json # 将需要保留的字段放入 cc-switch 的通用配置 / 共享配置片段,例如:{"enabledPlugins": {"frontend-design@claude-plugins-official": true,"superpowers@claude-plugins-official": true,"code-review@claude-plugins-official": true,"typescript-lsp@claude-plugins-official": true,"gopls-lsp@claude-plugins-official": true,"pyright-lsp@claude-plugins-official": true},"includeCoAuthoredBy": false}确认每个需要保留这些字段的供应商都勾选了“写入通用配置 / Write Shared Config”。新供应商默认勾选,已有供应商可能需要手动启用。
如果切换时提示“切换失败,请检查配置”,检查配置 JSON 格式是否正确,以及当前用户是否对 cc-switch 配置目录和 Claude Code / Codex 配置目录中的 settings.json 有写入权限;必要时以管理员模式启动 cc-switch 测试。
如果使用代理接管且发现通用配置没有正确写回,升级到 v3.12.2 或更新版本后重试。
Affected Versions
Section titled “Affected Versions”Source Issues
Section titled “Source Issues”本页汇总自 9 个真实 issue
- #182切换失败,请检查配置
- #258gemini 配置无效
- #582[BUG] 配置目录
- #1184昨天辛苦装一堆claude code插件,切换一下配置全没了。
- #1354配置个供应商后,启动供应商,会将Claude的settings.json文件内的其他内容都清空,只保留env内模型相关的配置
- #1454[BUG反馈] 版本3.12.1 claude 丢失settings.json配置
- #1706settings.json中的插件启用状态丢失
- #1907[Bug] hooks in ~/.claude/settings.json get randomly deleted when switching nodes
- #3418切换模型之后对话不能保留
- 为什么 cc-switch 不能只替换模型相关字段,而要覆盖整个 settings.json?
- 维护者说明这是有意设计。每个供应商保存的是完整 settings.json 快照,切换时整体写回。之前尝试字段级替换 / merge 时出现很多边界问题,例如嵌套数组、无法区分“用户主动删除字段”和“用户从未设置字段”、多层合并冲突等,所以改为全量快照加共享配置片段的方式。
- 插件配置、hooks、includeCoAuthoredBy 应该放在哪里?
- 放在 cc-switch 的“通用配置 / 共享配置片段”中。可以在编辑供应商时使用“从当前供应商提取”,然后确保相关供应商勾选“写入通用配置”。
- 为什么 hooks 是“有时候”丢失,不是每次切换都丢失?
- 因为切换前 cc-switch 会把当前 live 文件回填到当前激活供应商,所以你在当前供应商下修改的字段可能暂时保留;但切换到另一个没有这些字段的供应商时,目标供应商快照会覆盖 live 文件,字段就会消失。
- 切换后 Claude Code / Codex 对话不保留,是 cc-switch 删除了会话吗?
- 不是。维护者说明 cc-switch 只改写供应商 env,不写删会话。对话不保留是客户端在 env 变化后重新初始化会话。原对话仍在 ~/.claude/projects/<cwd>/,可以用 claude --resume 接续。
- 提示“切换失败,请检查配置”怎么办?
- 先检查配置 JSON 格式是否正确,再检查当前用户对 settings.json 以及相关配置目录是否有写入权限。维护者提到曾定位到用户没有文件写入权限导致切换失败,可以尝试右键 cc-switch 图标以管理员模式启动。
- 修改配置目录后,为什么 settings.json 仍然写入默认目录?
- 有维护者回复称相关功能写入的不是 settings.json,而是 ~/.claude.json。如果你看到默认目录中的文件被更新,需要先确认被修改的是哪个配置文件。
这是一个非官方社区 wiki,与 cc-switch 作者及项目本身无隶属关系。内容整理自项目公开的 GitHub issues。本站不分发任何软件。