
deployer 支持为 staging 和 production 等不同部署目标独立指定 git 分支(如 `develop` 或 `master`),只需在对应 host 配置中调用 `->set('branch', 'xxx')` 即可,无需修改部署逻辑。
在默认配置下,Deployer 会从远程仓库拉取 master 分支(或本地当前分支,取决于 git clone 行为),这导致 staging 和 production 始终部署相同代码。要实现「staging 部署 develop、production 部署 master」的精准环境隔离,关键在于为每个 host 显式声明 branch 参数。
以下是修正后的完整 deploy.php 片段(仅展示关键变更部分):
host('staging')
->hostname('hostname-here')
->user('username')
->identityFile('~/.ssh/id_rsa')
->multiplexing(false)
->set('deploy_path', '~/staging')
->set('branch', 'develop'); // ? staging 专属分支
host('production')
->hostname('hostname-here')
->user('username')
->identityFile('~/.ssh/id_rsa')
->multiplexing(false)
->set('deploy_path', '~/production')
->set('branch', 'master'); // ? production 专属分支✅ 生效原理:Deployer 的 deploy:prepare 任务会读取 branch 配置项,并在 git clone 或 git fetch && git checkout 步骤中自动使用该分支。你无需重写 deploy:clone 或 deploy:update_code 任务。
⚠️ 注意事项:
- branch 值必须是远程仓库中存在的有效分支名(区分大小写),否则部署将失败并抛出 fatal: couldn't find remote ref xxx 错误;
- 若使用 --tag 或 --commit 部署方式,branch 将被忽略,请确保统一采用分支策略;
- 推荐在 deploy:unlock 后添加 git:info 任务用于验证实际检出分支(可选调试):
after('deploy:unlock', 'git:info');
? 进阶建议:为提升可维护性,可将分支名提取为变量或通过环境变量注入,例如:
set('staging_branch', 'develop');
set('production_branch', 'master');
host('staging')->set('branch', get('staging_branch'));
host('production')->set('branch', get('production_branch'));这样既保持配置清晰,又便于 CI/CD 动态覆盖(如 DEPLOYER_STAGING_BRANCH=release/2.1 deploy staging)。最终,一次 deploy staging 将拉取并部署 develop 分支,而 deploy production 则严格部署 master 分支——真正实现环境与代码流的精准对齐。










