如何让Apache2虚拟主机指向特定Git分支并解决实时生效问题
问题分析
你当前的问题根源在于Apache直接指向了Git仓库的工作目录——Git仓库的工作目录会实时反映当前checkout分支的所有文件(包括未提交的修改),所以你在VSCode里保存的任何改动都会立刻被Apache读取并展示给用户。切换分支时工作目录的文件会被替换,自然也会直接影响浏览器内容。直接指向/var/www/myRepository/master无效是因为Git分支不是目录,仓库里不存在这个路径。
解决方案:用Git Worktree分离开发与发布目录
通过git worktree可以创建一个独立的目录,专门固定checkout到master分支,让Apache指向这个目录。开发分支的修改只会留在你的原仓库工作目录,只有当你主动将代码合并到master并更新发布目录时,改动才会对外展示。
步骤1:创建发布专用目录
在服务器上创建一个独立的目录,用于存放master分支的代码:
mkdir /var/www/myRepository-master
步骤2:关联Git仓库与发布目录
进入你的原Git仓库目录,执行以下命令将新目录关联到master分支:
cd /var/www/myRepository git worktree add /var/www/myRepository-master master
执行后,/var/www/myRepository-master目录会自动checkout到master分支,且与原仓库共享Git数据。
步骤3:修改Apache配置
将Apache虚拟主机的DocumentRoot改为新的发布目录,修改后的配置如下:
<VirtualHost *:443> ServerName example.com.br ServerAdmin myemailo@gmail.com DocumentRoot /var/www/myRepository-master <Directory /var/www/myRepository-master/> Options -Indexes -FollowSymLinks AllowOverride All </Directory> <DirectoryMatch "/var/www/myRepository-master/(\.|protected|themes/\w+/views|uploads/file)"> Order Deny,Allow Deny from all </DirectoryMatch> <FilesMatch "^\."> Order Deny,Allow Deny from all </FilesMatch> </VirtualHost> <VirtualHost *:80> ServerName example.com.br DocumentRoot /var/www/myRepository-master </VirtualHost>
步骤4:重启Apache服务
使配置生效:
# Debian/Ubuntu系统 sudo systemctl restart apache2 # RHEL/CentOS系统 sudo systemctl restart httpd
步骤5:后续维护流程
当你在开发分支完成工作后,按以下步骤更新对外展示的内容:
- 将开发分支的代码合并到
master分支(本地仓库操作):git checkout master git merge your-dev-branch - 更新发布目录的代码:
(因为发布目录与原仓库共享Git数据,cd /var/www/myRepository-master git pullgit pull会直接同步最新的master分支内容)
权限检查
确保Apache用户(通常是www-data)有读取发布目录的权限:
sudo chown -R www-data:www-data /var/www/myRepository-master sudo chmod -R 755 /var/www/myRepository-master
内容的提问来源于stack exchange,提问作者Rafael Medrano
相关产品推荐
相关产品推荐

