Laravel分离后端与public目录部署虚拟主机时的Git使用方案
嘿,这个场景我之前帮不少Laravel开发者处理过——HostGator的这种目录结构确实有点反常规,但完全不用折腾两个独立仓库或者复杂的子模块,有更优雅的适配方案。
方案1:使用Git Worktree(最推荐)
Git Worktree是专门解决“同一个仓库需要在多个目录下维护”的工具,完美匹配你的需求:
- 先确保后端目录的Git仓库是干净的(没有未提交的修改),然后在后端仓库根目录执行:
这里的git worktree add ../public_html/public mainmain是你仓库的主分支名,如果你的分支是master就改成对应名称。 - 执行完后,
../public_html/public就会成为这个Git仓库的一个“附属工作树”——你在后端目录修改代码提交后,public目录的内容会自动同步;反之,在public目录做的修改也能被Git追踪,提交后后端仓库的public文件夹也会更新。 - 后续如果要移除这个工作树,只需要在后端仓库执行:
git worktree remove ../public_html/public
方案2:创建符号链接(简单直接)
如果觉得Worktree有点陌生,符号链接是更直观的选择(HostGator虚拟主机默认允许符号链接):
- 先把
public_html/public里的现有内容备份好,然后删除这个目录:rm -rf ../public_html/public - 在后端仓库根目录,创建一个指向自身
public文件夹的符号链接到public_html目录下:ln -s $(pwd)/public ../public_html/public - 这样服务器访问的
public_html/public其实是指向你后端目录里的public文件夹,Git可以直接追踪后端的public目录,完全不影响网站运行。 - 小提醒:如果遇到403权限错误,检查一下目录权限(确保后端
public文件夹权限是755),或者联系HostGator客服确认服务器允许跟随符号链接。
方案3:Git子模块(不推荐,除非特殊需求)
子模块适合完全独立的代码库,但你的public是Laravel项目的核心部分,用子模块反而会增加维护复杂度:
- 初始化子模块的命令是:
git submodule add ../public_html/public public - 但后续你需要分别提交后端仓库和子模块的修改,拉取代码时还要额外执行
git submodule update --init,操作繁琐且容易出现版本同步问题,除非你真的需要把public作为独立仓库维护,否则不建议用这个。
为什么不建议两个独立仓库?
如果把后端和public分成两个仓库,会导致版本同步非常麻烦——比如你更新了Laravel的路由配置,需要同时在两个仓库提交,时间久了很容易出现代码版本不一致的问题,完全没必要给自己添堵。
总结下来,优先选Git Worktree,其次是符号链接,这两个方案都能让你用同一个Git仓库管理整个Laravel项目,完美适配HostGator的目录结构。
内容的提问来源于stack exchange,提问作者sandalone
相关产品推荐
相关产品推荐

