用途
该技能面向在 macOS 上使用 Laravel Herd 托管 Laravel 项目的开发者,帮助创建、列出或删除 Git worktree。其核心目标是让同一 Laravel 项目的多个分支能够并行运行,每个分支通过各自的 *.test URL 访问,并保持依赖、环境变量、数据库和缓存的隔离。
主要能力
- 为 Laravel 项目创建新的 Git worktree,并自动完成环境配置。
- 列出或删除已有的 worktree,删除时可选择同时删除对应的数据库。
- 通过 Herd 的 parked 目录机制,让每个 worktree 自动获得 <dir>.test 形式的访问 URL。
- 支持为单个 worktree 隔离 PHP 版本(如 php@8.1)。
- 提供针对 worktree 的隔离规则,覆盖 vendor/、node_modules/、.env、APP_KEY、数据库、Redis、storage/ 和 bootstrap/cache/ 等。
- 提供常见问题的诊断命令和排查思路。
使用方式
一次性设置
将存放主检出的父目录进行 park:
cd ~/Code # 你的 laravel 项目的父目录
herd park
验证:
herd parked
每个直接子目录都会成为 <name>.test。如果不想 park 父目录,可以使用 herd link 为每个 worktree 显式链接。
创建 worktree
使用辅助脚本:
bash scripts/worktree-new.sh <branch-suffix> <base-branch> [--driver sqlite|mysql|pgsql]
示例:
bash scripts/worktree-new.sh feat-billing main --driver sqlite
该脚本会创建 worktree、复制 .env、重写 APP_URL、DB_DATABASE 和缓存前缀、安装依赖、生成应用密钥并运行迁移。
删除 worktree
bash scripts/worktree-rm.sh <branch-suffix> [--drop-db]
按 worktree 切换 PHP 版本
cd ../myapp-legacy
herd isolate php@8.1
使用 herd isolated 列出所有覆盖,herd unisolate 恢复。
引导一个裸 worktree
对于用普通 git worktree add 创建的 worktree,需要手动复制 vendor/、node_modules/ 和 .env,并运行 composer install 等步骤。具体命令和注意事项见原文。
适用场景
- 用户要求为 Herd 托管的 Laravel 应用创建 worktree。
- 用户在切换 worktree 后遇到 vendor/、迁移、缓存或 .env 问题。
- 用户希望获得类似 myapp-feat.test 的按分支 URL,而无需手动配置 Nginx/Valet。
- 用户希望同一 Laravel 项目同时运行在多个 PHP 版本上。
限制
- 仅适用于 macOS 上的 Laravel Herd,不适用于 Valet、Linux Herd 或 Docker/Sail。
- worktree 目录名应仅使用 [a-z0-9-],否则 Herd 可能无法识别。
- 必须为每个 worktree 单独生成 APP_KEY、设置唯一的 SESSION_COOKIE 和 REDIS_PREFIX,否则会出现跨分支泄漏。
- vendor/ 和 node_modules/ 必须每个 worktree 独立,不能使用符号链接。
- 在 worktree 内切换基础分支后,需要重新运行 composer install。