phpstorm gui 提交默认不触发 pre-commit,因其使用 jgit 而非系统 git,仅执行内置的 reformat code、optimize imports、rearrange code 三项操作,不调用 .git/hooks/ 下脚本;需通过 file watchers 配置外部工具(如 php-cs-fixer 或 eslint)并勾选“before commit → run file watchers”实现提交前检查。

PhpStorm 的 GUI 提交默认不运行 .git/hooks/pre-commit,哪怕你写好了、加了权限、终端里 git commit 能拦住问题,点 Commit 按钮也完全没反应。
为什么 PhpStorm 点 Commit 不触发 pre-commit?
PhpStorm 用的是 JGit,不是系统 Git;它根本不会调用 .git/hooks/ 下的任何脚本。所谓“提交前检查”,默认只做三件事:Reformat code、Optimize imports、Rearrange code——全是 IDE 内置动作,和 ESLint、PHP-CS-Fixer、composer run lint 这类外部命令毫无关系。
常见错觉:
- 在 Commit 窗口勾了“Reformat code”,以为就是在跑
phpcbf或eslint --fix - 装了
husky或composer-git-hooks,但 PhpStorm GUI 提交不加载 Node.js 或 Composer 环境变量,hook 静默失败 - 看到
pre-commit文件在.git/hooks/下且chmod +x了,就认定“肯定生效”
想让 PhpStorm 提交前跑 PHP-CS-Fixer 或 ESLint?靠 File Watchers 绑定
核心思路:把代码检查变成 PhpStorm 能感知的“保存时动作”,再让它在提交前强制触发一次。这不是开关一开就行的事,得手动配。
以 PHP-CS-Fixer 为例(ESLint 同理):
-
Program:填项目本地node_modules/.bin/php-cs-fixer或全局路径(用which php-cs-fixer查),别依赖 PATH -
Arguments:--config=.php-cs-fixer.php --dry-run $FilePath$(先试运行,不改文件) -
Working directory:$ProjectFileDir$ - 勾选
Trigger watcher regardless of syntax errors,否则语法错直接跳过 - 然后去
Settings > Version Control > Commit > Before Commit,勾上Run File Watchers
注意:--dry-run 只报错不修;若要自动修,换成 --fix,但需确认团队接受自动修改行为。
PHP 项目更推荐用 GrumPHP + composer-git-hooks
比起手写 shell 脚本,GrumPHP 对 PhpStorm 更友好:它通过 Composer 注册为命令,且能读 .gitignore 和自定义 ignore 规则,避免扫 vendor 卡死。
配置要点:
- 安装:
composer require --dev phpro/grumphp - 生成
grumphp.yml后,明确设置ignore_patterns,比如- ./vendor/*、- ./storage/* - 确保
grumphp命令在 PhpStorm 终端能直接执行(检查$PATH或设bin_dir: vendor/bin) - 若仍想 GUI 提交触发,可新建一个 File Watcher,
Program填vendor/bin/grumphp,Arguments填git:commit
GrumPHP 默认只检查暂存区文件,比全量扫描快得多,也更贴近真实提交意图。
别忽略 PhpStorm 自身的“Inspecting code…”卡顿问题
如果你点了 Commit,弹窗一直停在 Inspecting code…,大概率不是钩子没跑,而是 PhpStorm 在执行自己的静态检查——尤其启用了 phpinspectionsea 插件后,它会无视 .gitignore 和 “Mark as Excluded”,硬扫整个 vendor 目录。
真正有效的关闭方式只有两个:
-
Settings > Editor > Inspections > Show inspection results in commit dialog→ 取消勾选 -
Settings > Version Control > Commit Dialog > Check code on commit→ 取消勾选
改完不用重启,下次 Commit 就不再卡。这个卡顿和你的 pre-commit 是否生效无关,但常被误认为“钩子卡住了”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











