第43章 Zed 第43章:可信 worktree 机制详解
Zed 中的 worktree 是一个目录或单个文件,Zed 会将其作为独立的“项目”打开。
当你运行 zed some/path、将文件或目录拖入 Zed,或打开用户设置文件时,Zed 都会打开一个新的 worktree。
注意:这里的范围比 Git worktree 更广。Git worktree 是 Git 管理的关联检出目录;而 Zed 的信任模型适用于每一个打开的文件或文件夹根目录,包括 Git worktree。
每个打开的 worktree 都可以包含一个 .zed/settings.json 文件,其中提供额外的配置选项,可能需要安装并启动语言服务器或 MCP 服务器。
为了让用户根据自己的威胁模型和风险承受能力进行选择,所有 worktree 默认处于限制模式。限制模式会阻止下载并运行 .zed/settings.json 中的相关项目。在 worktree 被信任之前,Zed 不会执行相关的未信任操作,而是等待用户确认。这给了用户审查项目设置、MCP 服务器和语言服务器的机会。
Zed 仍然信任它全局安装的工具。全局 MCP 服务器和全局语言服务器(如 Prettier 和 Copilot)照常安装和启动,不受 worktree 信任状态的影响。
如果 worktree 未被信任,Zed 会在标题栏中显示一个感叹号图标。点击该图标或使用 workspace::ToggleWorktreeSecurity 操作将弹出安全模态框,允许用户信任该 worktree。
信任 worktree 的决定会在重启后持久化。你可以使用 workspace::ClearTrustedWorktrees 命令清除所有已信任的 worktree。
该命令会重启 Zed,以确保没有任何未信任的设置、语言服务器或 MCP 服务器残留。
此功能在本地以及 SSH 和 WSL 远程主机上均可使用。在这种情况下,Zed 按主机追踪信任信息。
限制模式包含哪些内容
限制模式阻止以下行为:
- 解析和应用项目设置(
.zed/settings.json) - 安装和启动语言服务器
- 安装和启动 MCP 服务器
配置宽泛的 worktree 信任
默认情况下,Zed 不信任新创建的 worktree。用户必须逐个信任每个新的 worktree。虽然不推荐这样做,但用户可以通过以下设置(编辑方法)信任所有 worktree:
json [settings]
"session": {
"trust_all_worktrees": true
}
自动信任的 worktree 不会在重启后保留;只有手动信任的 worktree 才会。这确保了如果用户后来禁用 trust_all_worktrees,他们对新出现的 worktree 能重新做出信任决策。
信任层级
以下内容主要涉及内部细节,可能会变动,但有助于解释如何同时批准多个信任请求。 Zed 的信任机制分为多个层级,依据请求类型,从信任度最低到最高依次为:
- “单文件 worktree”
打开一个空白的 Zed 窗口后,你可以打开单个文件。在打开目录后,也可以打开该目录之外的文件。 一个常见示例是 {#action zed::OpenSettingsFile},它可能会为该文件启动语言服务器并创建一个新的单文件 worktree。
如果语言服务器遭遇供应链攻击,启动它会带来风险;因此,Zed 默认对此进行限制。除非其所在目录已被信任或已信任所有 worktree,否则每个单文件 worktree 都需要单独获得信任授权。
- “目录 worktree”
如果在 Zed 中打开了某个目录,则它是一个完整的 worktree。它可能会启动项目设置中定义的多个语言服务器和 MCP 服务器。因此,除非存在上级目录的信任授权(见下文),否则每个目录 worktree 都需要单独获得信任授权。
当目录 worktree 获得信任后,允许下载并启动语言和 MCP 服务器,此时系统也会自动为该宿主启用单文件 worktree 的信任。这在可信目录 worktree 中使用语言服务器功能并打开单个文件时非常有用。
- “父目录 worktree”
为了同时为多个目录 worktree 授予信任,可以通过勾选相应复选框,信任 Zed 中打开的某个父目录 worktree 的所有子目录。这将为其所有子目录(包括当前及潜在的目录 worktree)授予信任。