命令字典
Slash 命令、CLI 子命令、Hook 事件、启动参数的字典与演进史。
Slash 命令、CLI 子命令、Hook 事件、启动参数的字典与演进史。
在隔离的git worktree中启动Claude
--worktree [name]claude -w feature-auth--worktree(简写 -w)在启动 Claude Code 时创建一个隔离的 git worktree,并在其中开始会话。worktree 是独立的工作目录,有自己的文件和分支,与主 checkout 共享同一份仓库历史和 remote。因此一个会话里的编辑不会碰到另一个会话的文件。
| 项 | 内容 |
|---|---|
| 语法 | --worktree [name] / -w [name] |
name | 可选。省略时 Claude 自动生成名字,官方示例为 bright-running-fox |
| 默认路径 | 仓库根目录下的 .claude/worktrees/<name>/ |
| 默认分支 | 新分支 worktree-<name> |
| 默认基线 | 仓库在 remote 上的默认分支(通常是 main),见下文 worktree.baseRef |
worktree 需要 git 仓库。SVN、Perforce、Mercurial 等其他版本控制系统需要配置 WorktreeCreate / WorktreeRemove Hook 来替代 git 逻辑。
# 指定名字
claude --worktree feature-auth
# 简写
claude -w feature-auth
# 省略名字,自动生成
claude -w
# 基于某个 PR / MR 创建(需要给 # 加引号,避免 shell 把它当注释)
claude --worktree "#1234"
对 PR 的处理:
--worktree 接受 #<number>、GitHub PR URL 和 GitLab MR URL。origin remote 拉取该变更的 head commit,并创建 .claude/worktrees/pr-<number>。origin 的 host 选择拉取路径:github.com 用 pull/<number>/head,gitlab.com 用 merge-requests/<number>/head,其他 host 先试前者再试后者。#<number> 和 GitHub 风格的 PR URL。在会话中也可以直接让 Claude "work in a worktree",它会调用 EnterWorktree 工具创建。
官方 worktrees 文档中明确提到的组合:
| 组合 | 行为 |
|---|---|
-p(非交互) | 跳过 workspace trust 检查,所以 claude -p --worktree 可直接运行。退出时没有提示,Claude 不会清理该 worktree |
--continue / --resume | 恢复曾在 worktree 中的会话时,Claude Code 会把会话带回该 worktree。交互模式、-p 模式和 Agent SDK 均适用 |
--fork-session | fork 出的会话从你启动 Claude 的目录开始,原会话的 worktree 保持不动 |
--output-format stream-json | worktree 恢复被拒绝时,stdout 会收到 result 消息,subtype 为 error_during_execution,errors 数组里带同样的文本 |
所抓取的官方文档中没有说明 --worktree 与其他 flag 的互斥关系,这里不做推断。
所抓取的文档中没有与 --worktree 对应的环境变量,也没有能等价替代该 flag 的 settings 字段。下表是文档中与 worktree 行为相关的配置项:
| 配置 | env | settings.json / 其他位置 | 作用 |
|---|---|---|---|
| 基线分支 | 未见文档 | worktree.baseRef:"fresh"(默认)或 "head" | "fresh" 从 remote 默认分支创建;"head" 从当前本地 HEAD 创建,带上未推送的 commit |
| 复制被 gitignore 的文件 | 未见文档 | 项目根目录 .worktreeinclude(.gitignore 语法) | 创建 worktree 时自动复制 .env 等文件 |
| 替换创建逻辑 | 未见文档 | hooks.WorktreeCreate / hooks.WorktreeRemove | 完全替代默认 git worktree 逻辑,可放到 .claude/worktrees/ 之外 |
| 子 agent / 后台会话 worktree 的清理周期 | 未见文档 | cleanupPeriodDays | 定期清扫按它判断 worktree 是否过期 |
worktree.baseRef 不接受分支名。要从某个已有分支创建,请直接用 git worktree add。.worktreeinclude 只复制"匹配模式且被 gitignore"的文件,已跟踪文件不会被重复复制。| 约束 | 原因 |
|---|---|
| 必须在 git 仓库中(其他 VCS 需配置 Hook) | 默认实现基于 git worktree |
| 交互模式下,目录首次运行需先接受 workspace trust | 没跑过 claude 的目录,--worktree 会报错并提示先运行一次 claude;-p 不受此限 |
| worktree 内禁止编辑主 checkout | Claude Code 对 Edit / Write / NotebookEdit 指向主 checkout 的路径做拦截 |
| worktree 内的 Bash 命令不能把 git 指向主 checkout | 拦截 git -C、--git-dir、GIT_DIR / GIT_WORK_TREE 和 cd 到主 checkout 后再执行 git 等写法 |
| 无法验证命令中的 git 不会离开 worktree 时会拦截 | 例如命令名在运行时才计算,或语法无法解析。文档写明该检查无法关闭 |
.claude、.claude/worktrees 或 worktree 目录本身是 symlink 时拒绝创建 | 防止创建的文件落到仓库之外 |
| 仓库自身 config 里的 filter driver 在创建 worktree 时被跳过 | filter driver 是 shell 命令,任何能写仓库的东西都可能植入。副作用见下文 LFS |
claude --worktree "#1234"。isolation: worktree。子 agent 完成且无改动时,其临时 worktree 会自动删除。WorktreeCreate Hook 从 stdin 的 JSON 读取 name,自行创建目录并输出路径。官方文档以 SVN checkout 为例。-p 模式不清理:claude -p --worktree 创建的 worktree 退出时不会被清理。Claude Code 创建时加的锁会一直保留,直到之后某次会话的过期锁清扫将其释放。手动清理用 git worktree remove;若因锁被拒绝,先 git worktree unlock。--worktree <name> 打开的是现有 worktree,而不是新建。在默认 "fresh" 基线下,如果该 worktree 无未提交改动、仍在 Claude Code 创建的分支上、且没有自己的 commit(或其 PR/MR 已合并且 remote 分支已删除),重新打开时会被重置到仓库默认分支;其他情况保持在原来的 tip。官方文档称 v2.1.208 之前总是回到旧 tip。"fresh" 基线不含本地未推送的工作:想让 worktree 带上当前的本地 commit,需设置 worktree.baseRef: "head"。.gitignore:官方建议把 .claude/worktrees/ 加入 .gitignore,否则 worktree 内容会在主 checkout 中显示为未跟踪文件。.env:worktree 是全新 checkout,需要自行安装依赖,或用 .worktreeinclude 复制被 gitignore 的文件。WorktreeCreate Hook 时 .worktreeinclude 不生效:需要在 Hook 脚本里自己复制文件。git lfs install --local 配置 LFS 时,Claude Code 创建的 worktree 里是 LFS 指针文件而不是真实文件,需要在 worktree 内运行 git lfs pull。普通的 git lfs install(写入全局配置)不受影响。官方文档称 v2.1.247 之前会在创建时运行这些 driver。${CLAUDE_PROJECT_DIR} 不跟随 worktree:它仍指向会话启动时的项目根目录。需要 worktree 路径时,读取 Hook 输入 JSON 中的 cwd 字段。.claude/settings.local.json,对主 checkout 和该仓库的其他 worktree 都生效,并且不随 worktree 删除而消失。Windows 及文档所述的其他情况除外。官方文档称 v2.1.211 之前是保存在 worktree 内部。launch from the parent checkout 之类的提示时,应从主 checkout 启动。docs.claude.com/en/docs/claude-code/cli-reference 会 301 重定向到此地址。所抓取内容被截断,其中未能看到 --worktree / -w 的表格条目,该 flag 的行为以 worktrees 页面为准)cleanupPeriodDays 存在。所抓取内容中未见 worktree 设置小节,worktree.baseRef 的说明来自 worktrees 页面)修复 --worktree 会话在使用 reftable 引用存储的仓库中遗留 .git/worktrees 文件夹的问题。
修复了 `--worktree` 会话无法加载主仓库 project skills 的问题。
改进大型仓库上 --worktree 的启动性能,新 worktree 现在使用并行检出(git 2.32+)
修复与 --tmux 在 gitlab.com merge-request 上错误尝试 GitHub 风格 fetch 的问题
添加了对 GitLab merge request URL 的支持
修复 `--worktree` 和 `--worktree --tmux` 返回规范仓库根目录而不是当前 linked worktree 的问题
行为改变,现由 `worktree.baseRef` 设置控制是从 `origin/<default>` 还是本地 HEAD 分支
修复在非 git 仓库中退出错误的问题
修复包含前向斜杠时静默挂起的问题
修复了未从worktree目录加载skills和hooks的问题
改进了startup性能,新增worktree.sparsePaths设置支持git sparse-checkout
改进了 `--worktree` 启动时间,消除了启动路径上的 git subprocess。
新增 `--worktree` flag(短选项 `-w`)用于在隔离的 git worktree 中启动 Claude