如何在同一Ubuntu机器上用Git将开发分支推送到生产目录?
实现方案
1. 创建本地裸仓库作为中转
先在非网站目录创建裸仓库,用来同步开发与生产的代码:
sudo mkdir -p /www/git-repo sudo chown www-data:www-data /www/git-repo cd /www/git-repo sudo -u www-data git init --bare site.git
2. 配置开发站点(/www/dev)
进入开发目录,初始化Git并关联中转仓库:
cd /www/dev sudo -u www-data git init sudo -u www-data git add . sudo -u www-data git commit -m "Initial commit" # 添加中转仓库为远程源 sudo -u www-data git remote add origin /www/git-repo/site.git # 推送开发分支到远程 sudo -u www-data git push -u origin dev
3. 配置生产站点(/www/live)
进入生产目录,拉取中转仓库代码,并设置自动更新钩子:
cd /www/live # 先在开发目录创建prod分支并推送(首次配置执行) cd /www/dev && sudo -u www-data git checkout -b prod && sudo -u www-data git push origin prod # 回到生产目录克隆prod分支代码 cd /www/live sudo -u www-data git clone -b prod /www/git-repo/site.git .
设置自动拉取钩子
编辑中转仓库的post-receive钩子,推送prod分支时自动更新生产目录并修正权限:
sudo nano /www/git-repo/site.git/hooks/post-receive
写入以下内容:
#!/bin/sh while read oldrev newrev refname; do if [ "$refname" = "refs/heads/prod" ]; then echo "Updating production site..." GIT_WORK_TREE=/www/live sudo -u www-data git checkout -f prod sudo chown -R www-data:www-data /www/live fi done
给钩子添加执行权限:
sudo chmod +x /www/git-repo/site.git/hooks/post-receive sudo chown www-data:www-data /www/git-repo/site.git/hooks/post-receive
4. 日常开发部署流程
- 开发阶段(在/dev的dev分支):
cd /www/dev sudo -u www-data git add . sudo -u www-data git commit -m "Fix bug: xxx" sudo -u www-data git push origin dev - 确认无bug后部署到生产:
推送完成后,钩子会自动更新cd /www/dev sudo -u www-data git checkout prod sudo -u www-data git merge dev sudo -u www-data git push origin prod/www/live的代码,并修正文件权限。
权限说明
所有Git操作通过sudo -u www-data执行,确保仓库及网站文件始终归www-data:www-data所有,避免网站运行权限问题。
内容的提问来源于stack exchange,提问作者Stratisco
相关产品推荐
相关产品推荐

