Composer本身不管理Git钩子,仅通过第三方插件(如brainmaestro/composer-git-hooks)实现:插件监听post-install-cmd事件,读取composer.json中extra.hooks配置,生成对应脚本至.git/hooks/目录,并确保文件可执行;漏掉初始化、权限或路径任一环节均导致钩子静默失效。

Composer 本身不管理 Git 钩子,它只负责安装 PHP 包;所谓“支持”,全靠第三方插件实现,比如 brainmaestro/composer-git-hooks 或 captainhook/captainhook。装完包 ≠ 钩子就生效,漏掉初始化、权限、路径任一环,git commit 时都静默失败。
composer.json 的 extra.hooks 是怎么被读取的
brainmaestro/composer-git-hooks 通过 Composer 的 post-install-cmd 和 post-update-cmd 事件触发钩子写入逻辑,它会扫描 composer.json 中 extra.hooks 下的配置,生成对应脚本到 .git/hooks/ 目录。
-
extra.hooks必须是合法 JSON 对象,键名必须匹配 Git 钩子名(如pre-commit、commit-msg),不能拼错或大小写混淆 - 每个钩子值可以是字符串(单条命令)或数组(多条命令),数组内命令按顺序执行,任一失败即中止
- 命令运行环境是 Git 工作区根目录,但不自动加载 Composer autoloader —— 所以别直接写
php-cs-fixer,要用./vendor/bin/php-cs-fixer - 如果
composer.json里scripts被清空(如"scripts":{}),某些旧版插件会跳过初始化,需手动补上post-install-cmd
cghooks install 不生成 .git/hooks/pre-commit 怎么办
常见现象:运行 vendor/bin/cghooks install 后,.git/hooks/pre-commit 文件不存在,或内容为空、只剩 #!/bin/sh 和 exit 1。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先确认
vendor/bin/cghooks是否存在且可执行:ls -l vendor/bin/cghooks - 检查
composer.json的extra.hooks.pre-commit是否有定义,且不是null或空数组 - Windows 用户注意:Git Bash 默认用
/usr/bin/sh解释器,而cghooks生成的脚本可能含 Linux 换行符(\n)或 bash 特有语法(如set -e),导致静默退出 —— 建议在 WSL 下操作,或改用captainhook(对 Windows 兼容性略好) - 若项目已存在
.git/hooks/pre-commit且是其他工具(如 Husky)生成的,cghooks install默认不会覆盖 —— 加--force参数强制重写:vendor/bin/cghooks install --force
为什么新成员 clone 后钩子不自动启用
因为 .git/hooks/ 不进 Git 版本控制,clone 下来是空的;插件只在 post-install-cmd 触发,而首次 clone 后没运行 composer install,就不会调用安装逻辑。
- 确保
composer.json的scripts中包含:"post-install-cmd": "cghooks install"和"post-update-cmd": "cghooks update" - 不要写成
"post-install-cmd": "vendor/bin/cghooks install"—— Composer 在脚本执行时会自动 resolvebin目录,硬写路径反而在某些 CI 环境下失败 - 团队应统一文档说明:clone 后必做
composer install,否则钩子不会落地 - 更稳妥的做法是把钩子模板放
dev-tools/hooks/pre-commit,再用post-install-cmd复制 +chmod +x,绕过插件兼容性问题
真正容易被忽略的是:钩子脚本的执行权限和工作目录稳定性。Git 在不同平台、不同终端(CMD/PowerShell/Git Bash/WSL)下调用 .git/hooks/pre-commit 时,$PWD 并不总是项目根目录,尤其在 Windows 上。所以所有路径必须用 ./ 开头,所有命令尽量不依赖 shell 环境变量,否则某天 CI 通过、本地失败,排查起来极耗时间。

















