You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitLab CI中执行Commitizen提交信息格式检查?

问题场景

本地使用commitizen和pre-commit,配置如下:

- repo: https://github.com/commitizen-tools/commitizen
  rev: v3.27.0
  hooks:
    - id: commitizen
      name: commit message check

本地pre-commit可正常触发commitizen校验提交信息,但在GitLab CI流水线执行pre-commit run --all-files --show-diff-on-failure时,仅commitizen钩子未触发。需解决两个问题:

  1. 如何检查Merge Request(MR)中的提交是否符合commitizen格式?
  2. 如何通过pre-commit run执行commitizen钩子?
解决方案

一、为什么pre-commit run --all-files不触发commitizen钩子

commitizen的pre-commit钩子属于commit-msg阶段的钩子,仅在提交时校验提交信息文件;而--all-files参数只会触发针对文件内容变更的pre-commit阶段钩子,因此不会自动执行commitizen钩子。

二、检查MR中提交是否符合commitizen格式

直接使用commitizen的内置命令校验指定范围的提交,在GitLab CI中可利用内置环境变量确定MR的提交范围:

  1. 在CI脚本中添加以下命令:
cz check --rev-range $CI_MERGE_REQUEST_TARGET_BRANCH_SHA..$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA
  • 该命令会校验从目标分支到MR源分支的所有提交信息格式
  • 如果有不符合规范的提交,命令会返回非0状态码,终止CI流水线
  1. 若需要兼容非MR场景(比如分支推送校验),可以调整为校验当前分支与主分支的差异:
cz check --rev-range origin/main..HEAD

三、通过pre-commit run执行commitizen钩子

由于commitizen钩子属于commit-msg阶段,需要明确指定钩子阶段或ID来触发:

  1. 若要测试钩子本身(需提供提交信息文件):
    • 先创建临时提交信息文件:
      echo "feat: add new feature" > .git/COMMIT_EDITMSG
      
    • 运行钩子:
      pre-commit run commitizen --hook-stage commit-msg
      
  2. 若要批量校验历史提交,更推荐直接使用cz check命令(如上文所述),而非通过pre-commit触发,因为pre-commit的commit-msg钩子设计用于单次提交的实时校验,而非历史提交批量检查。

内容的提问来源于stack exchange,提问作者kostek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:52:13