如何用post-receive钩子移除Git裸仓库部署中的无关文件?
解决Kirby CMS裸仓库钩子部署时的文件清理问题
别担心,这个问题其实很好解决——虽然裸仓库本身没有自带的工作树,但你完全可以在钩子脚本里指定工作树路径来执行git clean命令,和你用git checkout时的思路一模一样!
为什么当前脚本不够?
git checkout -f只会覆盖仓库中已追踪的文件,但不会删除那些「Git仓库里不存在,但工作目录里还残留的文件/目录」——比如旧的Kirby插件、临时生成的缓存文件、测试用的脚本等等。这些冗余文件会导致你的部署目录和仓库状态不一致,而git clean就是专门用来清理这类内容的工具。
修改后的钩子脚本
你只需要在现有脚本中添加一行git clean命令,指定同样的--work-tree和--git-dir参数即可。这里给你优化后的完整脚本:
#!/bin/sh # 定义路径变量,方便后续修改 WORK_TREE="/var/www/html/myrepo" GIT_DIR="/var/repo/myrepo" # 强制检出最新代码,覆盖所有已追踪文件 git --work-tree=$WORK_TREE --git-dir=$GIT_DIR checkout -f # 清理所有未追踪的文件和目录(包括.gitignore中忽略的内容) # 先加上--dry-run参数预览要删除的内容,确认无误后再移除 git --work-tree=$WORK_TREE --git-dir=$GIT_DIR clean -d -f -x # 安装生产环境依赖 cd $WORK_TREE/assets npm install --production
关键参数说明
git clean的几个核心参数:
-d:不仅删除未追踪的文件,还会删除未追踪的目录-f:强制执行清理(Git默认在某些场景下会拒绝clean,避免误操作)-x:删除那些被.gitignore忽略的文件(比如Kirby的site/cache、site/logs这类自动生成的内容,部署时完全不需要保留)
个性化调整:保留特定文件
如果有某些本地文件需要保留(比如Kirby的site/config/local.php本地配置文件),可以用-e参数排除它:
git --work-tree=$WORK_TREE --git-dir=$GIT_DIR clean -d -f -x -e "site/config/local.php"
重要注意事项
- 权限检查:确保执行钩子的Git进程对
/var/www/html/myrepo目录有读写权限,否则clean和checkout都可能失败 - 先测试再执行:在正式部署前,先给
git clean加上--dry-run参数,它会列出所有将要被删除的文件/目录,确认没有误删风险后再去掉这个参数 - 备份重要文件:第一次执行前,最好先备份部署目录的内容,避免意外丢失数据
内容的提问来源于stack exchange,提问作者dodov
相关产品推荐
相关产品推荐

