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

Git Push报错「必须在工作树中运行」的原因排查

为什么会出现 remote: fatal: This operation must be run in a work tree 错误?

哥们,这个错误其实很好理解——你的远程仓库是个「裸仓库(bare repository)」,但你在post-receive钩子里写了必须在有实际文件的工作树仓库里才能执行的命令。

问题出在哪?

  • 远程仓库类型不对:你创建远程仓库时应该用了git init --bare命令吧?这种仓库是专门用来接收推送的,它只存Git的版本数据,没有实际的文件目录(也就是所谓的「工作树」)。如果你的post-receive脚本里写了git pull、git checkout这类需要操作实际文件的命令,Git肯定会报错,因为裸仓库根本没有工作树可以操作。
  • 钩子脚本逻辑有误:很多新手会想当然地在裸仓库的钩子里面直接操作代码部署,但裸仓库本身不具备工作环境,必须指定一个外部的工作目录来完成这些操作。

怎么解决?

如果你的需求是推送代码后自动部署到服务器,正确的做法是:

  1. 在服务器上找个地方创建一个普通的非裸仓库(或者直接建个空目录,把代码拉进去),比如/var/www/your-laravel-app。
  2. 修改你的post-receive脚本,指定工作树路径来执行部署操作,示例脚本如下:
#!/bin/sh
# 指定工作树路径,把推送的代码同步到这个目录
GIT_WORK_TREE=/var/www/your-laravel-app git checkout -f
  1. 确保这个脚本的权限没问题(你已经做了chmod +x post-receive,这步是对的)。

这样一来,推送代码后,钩子会把裸仓库里的版本数据同步到指定的工作目录,既符合Git的规则,也能完成自动部署的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:48:07