钩子
通过钩子,你可以在 worktree 生命周期中自动执行命令。
| 钩子 | 执行时机 | 工作目录 |
|---|---|---|
pre_start |
worktree 创建之后 | 源仓库 |
post_start |
worktree 创建之后 | 新的 worktree |
pre_clean |
worktree 删除之前 | 当前 worktree |
post_clean |
worktree 删除之后 | 主仓库 |
[hooks]pre_start = ["echo '正在准备 worktree...'"]post_start = [ "pnpm install", "pnpm db:migrate"]pre_clean = ["git stash"]post_clean = ["echo '清理完成'"]所有钩子命令中都可以使用以下环境变量:
| 变量 | 说明 |
|---|---|
VIBE_WORKTREE_PATH |
所创建 worktree 的绝对路径 |
VIBE_ORIGIN_PATH |
源仓库的绝对路径 |
[hooks]post_start = [ "echo 'Worktree 创建于: $VIBE_WORKTREE_PATH'", "echo '源仓库: $VIBE_ORIGIN_PATH'"]钩子的输出行为
Section titled “钩子的输出行为”vibe 会在钩子执行期间显示实时的进度树:
✶ Setting up worktree feature/new-ui…┗ ☒ Pre-start hooks ┗ ☒ npm install ☒ cargo build --release ⠋ Copying files ┗ ⠋ .env.local ☐ node_modules/| 情况 | 标准输出 | 标准错误 |
|---|---|---|
| 进度显示启用 | 被抑制 | 始终显示 |
| 进度显示禁用 | 输出到标准错误 | 始终显示 |
| 钩子执行失败 | N/A | 始终显示 |
钩子的执行顺序
Section titled “钩子的执行顺序”对于 vibe start:
- 创建 worktree
- 当配置了
[submodules] configs = [...]时,初始化列出的子模块 - 各个列出的子模块中已信任的
pre_start、copy 规则和post_start会以该子模块根目录为基准执行 - 父仓库的
pre_start钩子在源仓库中执行 - 复制父仓库的文件/目录
- 父仓库的
post_start钩子在新的 worktree 中执行
对于 vibe clean:
pre_clean钩子在当前 worktree 中执行- 删除 worktree
post_clean钩子在主仓库中执行
Node.js 项目
Section titled “Node.js 项目”[hooks]post_start = [ "pnpm install", "pnpm build"]pre_clean = ["git stash --include-untracked"]Bun 项目
Section titled “Bun 项目”[hooks]post_start = [ "bun install", "bun run build"]pre_clean = ["git stash --include-untracked"][hooks]post_start = [ "pnpm install", "pnpm db:migrate", "pnpm db:seed"]Docker 环境
Section titled “Docker 环境”[hooks]post_start = [ "docker-compose up -d", "sleep 5", "pnpm db:migrate"]pre_clean = ["docker-compose down"]Git 子模块
Section titled “Git 子模块”当某个直接子模块有自己的 setup 文件或钩子时,请使用一等公民的子模块配置:
[submodules]configs = ["libs/foo"]这会在新的 worktree 中执行 git submodule update --init -- libs/foo,然后通过常规的 trust store 加载 libs/foo/.vibe.toml。该子模块的 copy 规则和钩子会以 libs/foo 为基准解析路径,并在父仓库的 pre_start 钩子之前执行。
你可以使用 --no-hooks 选项跳过钩子:
vibe start feat/quick-fix --no-hooksClaude Code 集成
Section titled “Claude Code 集成”vibe 可以与 Claude Code 的 WorktreeCreate 和 WorktreeRemove 钩子集成。这会把 Claude Code 默认的 git worktree add 行为替换为 vibe 的完整工作流,包括钩子、CoW 文件复制和配置。
在 Claude Code 的 settings.json 中添加以下内容:
{ "hooks": { "WorktreeCreate": [ { "hooks": [ { "type": "command", "command": "vibe start --claude-code-worktree-hook --quiet 2>/dev/null" } ] } ], "WorktreeRemove": [ { "hooks": [ { "type": "command", "command": "vibe clean --claude-code-worktree-hook --force 2>/dev/null" } ] } ] }}当 Claude Code 创建 worktree 时(通过自然语言、isolation: "worktree" 或 /worktree 命令),vibe 会接管完整的生命周期:
WorktreeCreate:
- 从 stdin 读取 worktree 名称(Claude Code 钩子协议)
- 创建 git worktree
- 当配置了
[submodules] configs = [...]时,初始化列出的子模块并执行其已信任的 setup - 在源仓库中执行父仓库的
pre_start钩子 - 使用 CoW 复制父仓库的文件/目录
- 在新的 worktree 中执行父仓库的
post_start钩子(例如pnpm install) - 将 worktree 路径输出到 stdout 供 Claude Code 使用
WorktreeRemove:
- 从 stdin 读取 worktree 路径(Claude Code 钩子协议)
- 在 worktree 中执行
pre_clean钩子 - 删除 git worktree
- 在主仓库中执行
post_clean钩子
如果没有该集成,Claude Code 创建 worktree 时只会执行 git worktree add。借助 vibe 的钩子,你可以获得:
- 自动安装依赖(
pnpm install、bun install等) - CoW 文件复制(
.env、node_modules等) - 自定义 setup 脚本(数据库迁移、Docker 容器等)
- worktree 删除时的清理钩子