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肯定会报错,因为裸仓库根本没有工作树可以操作。 - 钩子脚本逻辑有误:很多新手会想当然地在裸仓库的钩子里面直接操作代码部署,但裸仓库本身不具备工作环境,必须指定一个外部的工作目录来完成这些操作。
怎么解决?
如果你的需求是推送代码后自动部署到服务器,正确的做法是:
- 在服务器上找个地方创建一个普通的非裸仓库(或者直接建个空目录,把代码拉进去),比如
/var/www/your-laravel-app。 - 修改你的
post-receive脚本,指定工作树路径来执行部署操作,示例脚本如下:
#!/bin/sh # 指定工作树路径,把推送的代码同步到这个目录 GIT_WORK_TREE=/var/www/your-laravel-app git checkout -f
- 确保这个脚本的权限没问题(你已经做了
chmod +x post-receive,这步是对的)。
这样一来,推送代码后,钩子会把裸仓库里的版本数据同步到指定的工作目录,既符合Git的规则,也能完成自动部署的需求。
内容的提问来源于stack exchange,提问作者Aleks Per
相关产品推荐
相关产品推荐

