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

Git预推送钩子中如何否定正则表达式以获取不合格提交ID

Git预推送钩子获取不符合规范的提交ID解决方案

问题分析

你原本的正则^[mM].*|^[cCfF].*ABCDE-[0-9]{4,}.*用于匹配符合规范的提交信息(以m/M开头,或以c/C/f/F开头且包含ABCDE-加4位及以上数字),现在需要反向获取不符合规范的提交ID。你尝试的负向环视正则失效,主要有两个原因:

  • 正则中错误将ABCDE写成了ACRNG;
  • Git默认使用基本正则表达式(BRE),不支持负向环视这类扩展正则特性,且你的正则逻辑存在重复行首匹配的问题。

两种可行解决方法

方法1:用--invert-grep反转匹配结果(推荐)

无需编写复杂的负向正则,直接利用Git的--invert-grep参数反转原有正则的匹配结果,逻辑更清晰且兼容性更好:

#!/bin/sh
# 预推送钩子脚本

# 获取推送的提交范围(根据Git钩子参数调整,部分环境可能需要从STDIN读取)
FROM="$1"
TO="$2"

# 定义符合规范的提交信息正则
VALID_PATTERN='^[mM].*|^[cCfF].*ABCDE-[0-9]{4,}.*'

# 获取不符合规范的提交ID:反转匹配结果
INVALID_COMMITS=$(git rev-list --grep="$VALID_PATTERN" --invert-grep "$FROM..$TO")

# 检查是否存在违规提交
if [ -n "$INVALID_COMMITS" ]; then
    echo "错误:以下提交的信息不符合规范:"
    echo "$INVALID_COMMITS"
    echo "规范要求:提交信息需以m/M开头,或以c/C/f/F开头且包含ABCDE-加4位及以上数字"
    exit 1
fi

exit 0

方法2:启用扩展正则(ERE)并修正负向环视

如果坚持使用负向环视,需给git rev-list添加-E参数启用扩展正则,同时修正正则逻辑:

#!/bin/sh
# 预推送钩子脚本

FROM="$1"
TO="$2"

# 修正后的负向环视正则:匹配既不符合m/M开头,也不符合c/C/f/F+ABCDE-4位数字的提交
INVALID_PATTERN='^(?!([mM].*|([cCfF].*ABCDE-[0-9]{4,}.*))).*'

# 启用ERE扩展正则,匹配不符合规范的提交
INVALID_COMMITS=$(git rev-list -E --grep="$INVALID_PATTERN" "$FROM..$TO")

if [ -n "$INVALID_COMMITS" ]; then
    echo "错误:以下提交的信息不符合规范:"
    echo "$INVALID_COMMITS"
    echo "规范要求:提交信息需以m/M开头,或以c/C/f/F开头且包含ABCDE-加4位及以上数字"
    exit 1
fi

exit 0

关键说明

  • Git默认的正则引擎是BRE,不支持环视、量词{n,}等扩展特性,使用这些特性时必须加-E参数切换到ERE;
  • --invert-grep是更稳妥的方案,避免了复杂正则的编写和兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 01:17:24