GrumPHP钩子不运行的主因是文件缺失、权限不足或被--no-verify绕过;需确保.git/hooks/pre-commit存在且chmod+x,运行grumphp git:install,并避免GUI工具忽略钩子。

GrumPHP 不能解决 Git 钩子“自动触发”问题——它本身就是靠自动触发工作的。真正要解决的,是钩子被意外跳过、不生效、或执行失败却没阻断提交的问题。
为什么 pre-commit 钩子有时不运行?
Git 默认不会自动安装钩子,GrumPHP 只是帮你生成和管理它们,但前提是:钩子文件得存在且可执行,且未被 --no-verify 绕过。
-
git commit --no-verify会直接跳过所有pre-commit钩子(GrumPHP 也拦不住) - 项目根目录下没有
.git/hooks/pre-commit文件,或它不是可执行脚本(chmod +x缺失) - GrumPHP 安装后未运行
vendor/bin/grumphp git:install,导致钩子未写入.git/hooks/ - 使用了 GUI 工具(如 VS Code 内置提交、Sourcetree)而它们默认禁用或忽略钩子
如何确认 GrumPHP 钩子是否真在运行?
别只看终端有没有输出,要验证执行路径和退出行为。GrumPHP 的钩子本质是一个 PHP 脚本调用 grumphp run,失败时必须返回非零状态码才能阻止提交。
- 手动执行钩子脚本:
.git/hooks/pre-commit,观察是否报错(比如php: command not found或找不到vendor/autoload.php) - 在
grumphp.yml中加一个故意失败的任务,例如用shell任务执行exit 1,再试git commit看是否被拦截 - 检查钩子脚本第一行是否为
#!/usr/bin/env php或明确指向可用的 PHP 解释器(多 PHP 版本环境容易出错)
Composer 自动安装钩子的局限在哪?
GrumPHP 的 composer install 后自动执行 git:install 是可选行为,且仅在首次安装或 grumphp.yml 变更时触发,不可靠。
立即学习“PHP免费学习笔记(深入)”;
- 该行为由
GrumPHP\Composer\GrumPHPPlugin控制,但若项目中禁用了 Composer 插件("config": {"disable-tls": true}或"plugin-api-version"不匹配),就会静默失效 -
git:install默认只写入当前仓库的.git/hooks/,克隆新副本后需重新运行 - 某些 CI 环境(如 GitHub Actions)根本不用本地 Git 钩子,此时 GrumPHP 应改用
grumphp run显式调用,而非依赖钩子
最常被忽略的一点:GrumPHP 的配置加载顺序和环境变量。它会读取 grumphp.yml,但如果你在 phpunit.xml 或 .env 里覆盖了 PATH 或 PHP_BINARY,钩子里的 PHP 命令可能指向错误版本,导致任务看似运行实则静默失败。



















