Composer不管理Git钩子,需通过post-install-cmd触发captainhook install写入.git/hooks;该钩子仅在vendor重建时执行,且scripts中必须严格配置为数组格式["captainhook install"],同时captainhook.json需手动启用对应钩子并确保路径正确、权限可执行。

Composer 本身不管理 git hooks,它只负责安装 PHP 包;所谓“自动化配置”,本质是靠第三方包(如 captainhook/captainhook 或 brainmaestro/composer-git-hooks)在 post-install-cmd 阶段往 .git/hooks/ 写脚本——漏掉任一环节,钩子就静默失效。
composer.json 的 scripts 必须正确定义 post-install-cmd
Composer 只识别带 -cmd 后缀的内置事件名。写成 post-install、after-install 或 onPostInstall 都不会触发。
-
post-install-cmd仅在vendor/被重建时运行(比如首次composer install或composer.lock变更),不是每次执行都跑 - 命令必须是数组格式:
["captainhook install"],而不是字符串"captainhook install"(后者可能被 shell 错误解析) - 如果项目
composer.json中"scripts":{}是空对象,该阶段直接跳过,不会报错也不会提醒
.git/hooks/pre-commit 文件必须存在且可执行
Git 只认 .git/hooks/ 下无扩展名、权限为 755(Linux/macOS)或对应可执行状态(Windows 需 .bat 或 .ps1)的文件。不存在或不可执行,git commit 就完全没反应。
- 手动验证:运行
ls -l .git/hooks/pre-commit,输出中应含-rwxr-xr-x - 常见错误:脚本内容为空、仍是 Git 默认模板(以
#!/bin/sh+exit 1开头)、或被 husky 等 Node 工具覆盖 - Windows 用户注意:
.git/hooks/下的 shell 脚本默认不可执行,建议统一用 WSL 或明确文档要求 bash 环境
captainhook.json 启用开关和路径必须手调
运行 vendor/bin/captainhook init 生成的 captainhook.json 默认所有钩子 "enabled": false,这是最常被忽略的点。
帮助用户满足已验证需求:代理用户在Clawhub上对GitHub式工作流有强烈需求,需要实用帮助修复bug、强化设置。
- 必须手动编辑
captainhook.json,把对应钩子(如pre-commit)设为"enabled": true -
command字段是 shell 命令字符串,不是函数调用;路径要用相对项目根目录的写法,例如"php ./scripts/check-staged.php",不能写成"php scripts/check-staged.php"(缺./) -
triggered_by列表要匹配你实际修改的文件类型,比如只配["php"],但改了.js文件,钩子就不会触发
新成员 clone 后钩子不生效怎么办
因为 .git/hooks/ 不会被 Git 跟踪,克隆后是空的。不能靠“复制模板”解决,得靠初始化流程自动补全。
- 确保
composer.json中post-install-cmd和post-update-cmd都配置了"captainhook install"或"cghooks install" - 新成员首次
git clone后,必须立刻运行composer install(不是composer update),否则post-install-cmd不触发 - CI 环境常加
--no-scripts,导致钩子安装跳过;若需在 CI 中启用,得显式传--no-scripts=false
真正容易被忽略的不是怎么装,而是权限、路径、触发条件这三点——它们不报错,只沉默跳过。调试时先确认 .git/hooks/pre-commit 存在且可执行,再看 captainhook.json 里 enabled 是否为 true,最后检查命令路径是否能在 Git 进程上下文中访问到。










