为啥 Windows 上的 git commit-msg 与正则表达式不匹配

Posted

技术标签:

【中文标题】为啥 Windows 上的 git commit-msg 与正则表达式不匹配【英文标题】:Why do git commit-msg on Windows not match regex为什么 Windows 上的 git commit-msg 与正则表达式不匹配 【发布时间】:2019-05-18 03:45:10 【问题描述】:

我正在尝试创建一个 git commit-msg 挂钩,其中包括一个简单的正则表达式来验证日志消息。它不能使用通常的 bash 语法。

我用一个非常简单的正则表达式试了一下,还是不行

知道我做错了什么吗?

这是一个包含明显匹配的简单示例,但它打印出“不匹配”

#!/bin/bash
message="[GLSD-0000]"
echo "Message: '$message'"
regex="\[GLSD-\w+\]"
if [[ $message =~ $regex ]]; then echo "yes";else echo "no match!"; fi

使用 git 版本 2.18.0.windows.1

【问题讨论】:

Bash 通常不支持像 \w 这样的 Perl 风格的通用字符类型。改为阅读POSIX extended regular expressions(或咨询man re_format,如果您的本地计算机上可用)。 【参考方案1】:

您尝试做的一些注意事项,

    您的解释器确实#!/bin/sh 不支持bash 中的正则表达式操作,即使您没有使用它。你应该再次使用 bourne shell bash (#!/usr/bin/env bash). [[..]]= 对左侧操作数与右侧操作数进行字符串匹配。对于正则表达式支持,您需要使用~ 运算符 bash 仅支持 ERE(扩展正则表达式)的最小版本,其中不支持 \w(所有单词)。

因此,在针对bash shell 的脚本中,您应该将其编写为

#!/usr/bin/env bash

# equivalent of '\w' in the regex flavor supported by bash
re='\[GLSD-[A-Za-z0-9_]+\]'
msg='[GLSD-0000]'
[[ $msg =~ $re ]] && echo "yes" || echo "no match!"

【讨论】:

另外,/bin/sh 不支持 [[ ]] 开头。 不应该1 可能是$11 始终是字母数字,测试没有意义。 谢谢@BenjaminW。 .我会让 OP 随意使用它。 抱歉出现一些转录错误。请看更正 @VictorGrazi:已更新以匹配您的示例

以上是关于为啥 Windows 上的 git commit-msg 与正则表达式不匹配的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的git中没有commit and push

为啥有人应该在 git commit 之前使用 git add?或者为啥有人应该使用 git add 呢?

为啥 git 在 Windows 下记不住我的密码

git 强制回退服务器上的commit

为啥带有 SourceTree 的 WSL2 上的 Git 对我来说这么慢?

Git 如何迁移仓库并保留 commit 记录?