You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:12:14