pre-commit中pygrep正则校验提交信息始终返回True如何解决
问题原因
- 核心逻辑与pygrep默认判定规则相反:pygrep钩子的默认校验逻辑是扫描输入内容,匹配到entry定义的正则则判定校验失败,无匹配内容则判定校验通过。你当前配置的正则是匹配符合要求的提交格式,当提交信息完全不符合格式(比如
why)时,正则匹配不到任何内容,pygrep会直接判定校验通过,和预期逻辑完全倒置。 - 正则缺少边界锚定:原有正则未加行首
^、行尾$锚点,即使修正匹配逻辑,也会出现“提交信息任意位置夹带符合格式的片段即判定合规”的问题,比如test ERP-123 #fix 问题这类前后带无关内容的提交会被误判为通过。
修正配置
调整两个点即可实现正确校验:
- 给正则添加行首锚定,强制提交信息从开头就匹配格式规则
- 在args中添加
--negate参数,反转pygrep的匹配逻辑:匹配不到合规格式时判定失败,匹配到时判定通过
修正后的完整配置如下:
- repo: local hooks: - id: jira-ticket name: check for jira ticket entry: '^ERP-[0-9]+ #(feat|fix|docs|style|refactor|perf|test|chore) .+' args: [--multiline, --negate] language: pygrep stages: [commit-msg]
补充说明
- 上述配置默认校验commit message首行符合格式要求,首行后可以空行追加提交正文,符合通用git提交规范。如果需要强制整个提交信息只能有格式对应的一行内容,只需要在正则末尾添加行尾锚定
$,将entry修改为'^ERP-[0-9]+ #(feat|fix|docs|style|refactor|perf|test|chore) .+$'即可。 - 修正后执行
git commit -m "why"这类不符合格式的提交时,钩子会直接返回失败拦截提交;提交ERP-234 #feat 新增采购单合并功能这类符合格式的信息时才会校验通过。
内容的提问来源于stack exchange,提问作者CHIU TZE CHEUNG
相关产品推荐
相关产品推荐

