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
相关产品推荐
相关产品推荐

