Git Push无法同步子域名目录变更至远程仓库问题求助
这个问题我之前帮朋友排查过类似的,大概率是服务器路径配置或者Git部署钩子的问题,咱们一步步来排查:
第一步:确认服务器上的Web根目录对应关系
登录你的服务器,先搞清楚两个关键路径:
- 主域名
www.website.com的Web根目录(比如/var/www/main-site) - 子域名
english.website.com的Web根目录配置
你需要确认:子域名的根目录是不是确实指向主项目仓库下的english文件夹(比如/var/www/main-site/english)。如果子域名配置的是另一个独立路径(比如/var/www/english-site),那你推送到主仓库的english目录自然不会同步到子域名的实际运行目录,这是最常见的原因。
如果路径配置不对,直接修改Web服务器(Nginx/Apache)的子域名配置文件,把根目录改成主项目下的english目录即可。
第二步:检查Git部署的post-receive钩子
很多人用Git钩子(尤其是post-receive)来实现推送后自动部署到Web目录。如果你的远程仓库配置了这个钩子,需要检查:
钩子文件是否有执行权限:远程仓库的
.git/hooks/post-receive需要设置chmod +x post-receive才能生效。钩子内的同步命令是否覆盖了子目录:比如你的钩子命令可能是这样的:
git --work-tree=/var/www/main-site --git-dir=/var/www/main-site.git checkout -f这个命令会把整个仓库的内容同步到主域名根目录,包括
english子目录——只要子域名根目录指向的是这个english文件夹,那变更应该会同步。但如果钩子没执行(比如权限不够),或者命令里有遗漏,就会导致子目录没更新。如果子域名的根目录是独立路径,那可以在钩子末尾加一行同步命令:
rsync -avz /var/www/main-site/english/ /var/www/english-site/ --delete这样每次推送主仓库后,都会把
english目录的内容同步到子域名的独立根目录。
第三步:排查缓存问题
如果上面两步都没问题,那可能是缓存在搞鬼:
- 先强制刷新浏览器(Ctrl+F5),排除浏览器本地缓存的问题;
- 如果是服务器端开启了静态文件缓存(比如Nginx的
proxy_cache或者expires配置),可以临时关闭缓存,或者手动清除服务器缓存,或者给静态文件加版本号来规避缓存。
是否需要为每个子域名单独创建仓库?
不是必须的,如果子域名只是主项目的一个子目录,内容和主域名关联性强,完全可以通过调整Web配置和部署钩子来实现同步,不需要单独建仓库。
但如果未来子域名的内容会越来越独立,需要单独维护分支、设置不同的权限,或者不想让子域名的变更影响主域名,那单独创建仓库会更灵活——每个子域名对应一个独立仓库,推送时互不干扰,部署也更清晰。
内容的提问来源于stack exchange,提问作者zeeks

