You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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"

重要注意事项

  1. 权限检查:确保执行钩子的Git进程对/var/www/html/myrepo目录有读写权限,否则clean和checkout都可能失败
  2. 先测试再执行:在正式部署前,先给git clean加上--dry-run参数,它会列出所有将要被删除的文件/目录,确认没有误删风险后再去掉这个参数
  3. 备份重要文件:第一次执行前,最好先备份部署目录的内容,避免意外丢失数据

内容的提问来源于stack exchange,提问作者dodov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:47:33