如何用单个Git仓库将develop、main分支分别部署至测试子域名与主域名?
单仓库部署多分支到不同域名的实现方案
完全可行,使用Git的git worktree功能就能实现单仓库下独立管理多分支的部署,既节省存储空间,又能保证不同分支的更新互不影响。
核心原理
git worktree允许一个Git仓库拥有多个独立的工作目录,每个目录对应不同的分支,所有工作目录共享同一个.git仓库目录,不会占用双倍项目空间,完美解决你提到的体积问题。
具体实现步骤
1. 配置多工作区
假设你的主仓库已克隆在~/project-main(对应main分支),现在为develop分支创建独立工作区:
# 进入主仓库目录 cd ~/project-main # 为develop分支创建独立工作目录~/project-dev git worktree add ../project-dev develop
执行后,~/project-dev就是develop分支的独立工作目录,和主仓库共享.git目录,仅占用项目文件的一份额外空间(而非整个仓库)。
2. 编写部署脚本
针对两个工作目录分别编写部署逻辑,避免分支切换带来的文件覆盖问题。示例脚本如下:
#!/bin/bash # 部署main分支到主域名 deploy_production() { echo "开始部署main分支到主域名..." cd ~/project-main git pull origin main # 替换为你的实际部署操作,比如复制静态文件到web根目录 cp -r ./dist /var/www/production/ # 可选:重启web服务使更新生效 systemctl reload nginx } # 部署develop分支到测试子域名 deploy_staging() { echo "开始部署develop分支到测试子域名..." cd ~/project-dev git pull origin develop cp -r ./dist /var/www/staging/ systemctl reload nginx } # 根据参数选择部署目标 case "$1" in production) deploy_production ;; staging) deploy_staging ;; all) deploy_production deploy_staging ;; *) echo "使用方式: $0 {production|staging|all}" exit 1 esac
3. 日常维护命令
- 查看所有工作区:
git worktree list - 删除某个工作区:先删除对应目录(如
rm -rf ~/project-dev),再执行git worktree prune清理仓库记录
为什么之前切换分支会互相影响?
你之前在同一个工作目录切换分支,Git会替换当前目录下的文件以匹配目标分支,导致两个版本的内容互相覆盖。而git worktree通过独立工作目录实现分支隔离,每个目录的文件操作完全独立,更新其中一个分支不会影响另一个。
内容的提问来源于stack exchange,提问作者RDMaven
相关产品推荐
相关产品推荐

