PhpStorm 本身不提供“强制写注释”开关,因其提交功能直接调用 Git 命令,而 Git 默认允许空提交信息;必须通过项目级 pre-commit 钩子脚本拦截空消息才能实现强制校验。

PhpStorm 本身不提供“强制写注释”的开关,但可以通过 Git 的 pre-commit 钩子 + PhpStorm 提交流程配合实现——只要提交信息为空或仅含空白字符,git commit 就会中止,根本不会生成 commit 对象。
为什么 PhpStorm 没有“必须填提交信息”选项
PhpStorm 的 Commit 窗口允许空消息提交(比如只敲回车),这是它复用 Git 原生命令的结果。Git 默认不校验提交信息内容,IDE 也不会主动拦截。所谓“强制”,必须由 Git 层控制,不是 UI 层能开关的。
- PhpStorm 提交本质是调用
git commit -m "..."或打开编辑器写 message - 空 message 被 Git 视为合法(等价于
git commit --allow-empty-message) - IDE 不会主动拒绝空输入,也不校验格式长度或关键词
用 pre-commit 钩子拦截空提交信息
在项目根目录的 .git/hooks/pre-commit 文件里写一个 shell 脚本,每次 git commit 前自动运行,检查即将写入的 message 是否有效。
- 钩子脚本需可执行:
chmod +x .git/hooks/pre-commit - 核心逻辑:读取
git log -1 --pretty=%B HEAD(上一条)或临时 message 文件(取决于 Git 版本),但更可靠的是用git status --porcelain+git commit --dry-run组合判断 - 推荐轻量方案(兼容 PhpStorm):
#!/bin/sh MSG=$(git log -1 --pretty=%B HEAD 2>/dev/null | sed 's/^[[:space:]]*//; s/[[:space:]]*$//') if [ -z "$MSG" ]; then echo "❌ Commit message is empty. Please write a meaningful description." exit 1 fi
- 注意:这个脚本只拦空消息,不拦“fix bug”这种无效内容;如需格式校验(如 Conventional Commits),得加正则匹配
让 PhpStorm 提交时自动触发钩子
只要钩子文件存在且可执行,PhpStorm 执行 git commit 时就会调用它——不需要额外配置,也不依赖是否勾选 “Amend” 或 “Include unversioned files”。
立即学习“PHP免费学习笔记(深入)”;
- 确保
.git/hooks/pre-commit在项目根目录下(不是全局) - 不要用
--no-verify参数绕过(PhpStorm 默认不用该参数) - 如果 PhpStorm 提交后没报错却仍能空提交,说明钩子没生效:检查文件权限、是否被 IDE 缓存忽略、或是否误放在
.git/hooks/pre-commit.sample - 验证方式:终端进项目目录,执行
git commit --allow-empty -m "",应报错退出
别指望模板或设置替代钩子
commit.template 只是预填充文字,不能阻止空提交;Settings → Version Control → Commit 中的 “Require commit message” 选项根本不存在——那是很多人记混了其他 IDE 或插件的功能。
- 模板路径配置(
git config --local commit.template ".gitmessage.txt")只影响新开编辑器窗口的默认内容 - PhpStorm 的 “Commit Message” 输入框没有必填校验逻辑,即使你清空了模板内容也能点 Commit
- 真正起作用的只有 Git 自身的钩子机制,其他都是辅助手段
钩子脚本一旦部署,所有本地提交(无论来自 PhpStorm、命令行还是其他 GUI 工具)都会受控;但要注意它不上传到远程仓库,每个协作者都得单独配置——团队统一做法是把钩子脚本纳入项目文档,并用 husky 或 grumphp 等工具自动化安装。


















