Windows下Git Hooks执行报错找不到php命令,但命令实际存在
Git钩子无法找到php.exe的原因与解决办法
问题背景
在Windows系统中配置了如下post-merge Git钩子:
#!/bin/sh php artisan db:seed --class=PermissionSeeder
执行git pull操作时触发错误:.hooks/post-merge: line 3: php: command not found。但满足以下前提:
- 在Windows终端(CMD/PowerShell)执行相同的
php artisan命令可正常运行 php.exe已添加至用户级环境变量Path中
核心原因
Git钩子默认使用Git自带的MinGW/MSYS2 shell(即脚本开头#!/bin/sh指定的环境),这个shell的环境变量与Windows原生终端的环境变量不共享完全一致的配置:
- 用户级
Path变量可能未被MinGW shell正确加载,尤其是PHP路径是后续添加的情况下,Git的shell进程未同步最新的环境变量 - MinGW shell对Windows可执行文件的解析逻辑不同,直接用
php可能无法自动匹配到php.exe,需要明确指定后缀或完整路径
解决方法
方法1:指定PHP完整路径
将钩子中的php替换为php.exe的绝对路径,注意使用正斜杠或转义反斜杠:
#!/bin/sh "C:/Program Files/PHP/php.exe" artisan db:seed --class=PermissionSeeder
方法2:手动注入PHP路径到环境变量
在钩子开头先把PHP所在目录添加到PATH,让MinGW shell能找到php命令:
#!/bin/sh export PATH="/c/Program Files/PHP:$PATH" php artisan db:seed --class=PermissionSeeder
方法3:改用Windows原生CMD执行钩子
修改脚本开头为#!/cmd.exe /c,让钩子使用Windows原生CMD环境,直接继承系统环境变量:
#!/cmd.exe /c php artisan db:seed --class=PermissionSeeder
内容的提问来源于stack exchange,提问作者Giacomo M
相关产品推荐
相关产品推荐

