如何利用Git Hooks仅部署单个文件夹?GoDaddy cPanel钩子配置疑问
解决Git Hooks部署时忽略开发文件&仅部署单个文件夹的问题
嘿,刚好这俩需求可以一起搞定!既然你已经在cPanel上搭好了Git Hooks,那只需要修改post-receive钩子脚本,就能实现推GitHub时保留开发文件,服务器部署时只同步需要的文件夹,完全不冲突。
核心思路
cPanel默认的Git部署会全量checkout仓库内容,但我们可以用git archive命令精准导出指定文件夹的内容,跳过/src这类开发目录——这样GitHub能收到所有你没在.gitignore里排除的文件,而服务器只部署生产需要的资源。
具体操作步骤
1. 编辑post-receive钩子文件
找到你的Git裸仓库的hooks目录(通常路径是~/repos/你的项目名.git/hooks/post-receive),用cPanel的文件管理器或者SSH打开这个文件,替换默认内容为下面的脚本:
#!/bin/bash # 配置你的仓库路径和部署目录 REPO="$HOME/repos/your-project.git" # 这里改成你的cPanel网站根目录,比如public_html或者子目录 DEPLOY_DIR="$HOME/public_html" # 切换到部署目录,失败则退出 cd "$DEPLOY_DIR" || { echo "部署目录不存在!"; exit 1; } # 可选:清空部署目录的旧文件(如果需要完全替换,注意保留用户上传的文件!) # rm -rf "$DEPLOY_DIR"/* # 从仓库导出/public文件夹的内容到部署目录 git --git-dir="$REPO" archive HEAD:public | tar x -f - # 如果还有其他需要部署的单个文件/文件夹,重复上面的命令即可 # 比如导出根目录的配置文件: # git --git-dir="$REPO" archive HEAD:config.prod.php | tar x -f - echo "✅ 部署完成:仅同步了public文件夹,已忽略src等开发文件"
2. 给钩子文件加可执行权限
如果是用SSH操作,运行:
chmod +x ~/repos/your-project.git/hooks/post-receive
如果用cPanel文件管理器,右键钩子文件,修改权限为755(所有者读/写/执行,组和其他读/执行)。
3. 测试验证
- 本地推代码到GitHub:正常推送即可,
.gitignore没排除的/src会被推送到GitHub,完全不受服务器钩子影响。 - 推代码到cPanel的仓库:钩子会自动把
/public文件夹的内容同步到部署目录,/src完全不会出现在服务器上。
注意事项
- 确保
/public文件夹在Git仓库中是被追踪的(没被.gitignore忽略),否则git archive找不到它。 - 如果部署目录有需要保留的用户上传文件(比如uploads文件夹),不要用
rm -rf清空,建议把静态部署内容和用户文件分开存放,比如部署到public_html/static,用户文件放public_html/uploads。 - 手动执行钩子脚本可以快速排查问题:
cd ~/repos/your-project.git/hooks && ./post-receive,看是否有报错信息。
内容的提问来源于stack exchange,提问作者forkinspace
相关产品推荐
相关产品推荐

