regex - 在 Windows 上执行 git-hooks 出错

标签 regex windows git githooks git-bash

所以,

我已经为预推送编写了一个简单的 git-hooks,它在 Linux 或 Mac 上工作得很好,但在 Windows 上不起作用。

脚本: 尝试将提交消息与正则表达式匹配,如果匹配则应返回 0 否则退出。

根据我阅读的文章,他们说钩子(Hook)应该可以正常工作。

命令:

if [[ "$message" =~ "$regular_expression" ]]; 

错误:

.git/hooks/pre-push: line 6: conditional binary operator expected
.git/hooks/pre-push: line 6: syntax error near `=~'
.git/hooks/pre-push: line 6: `  if [[ "$message" =~ "$regular_expression" ]]; then'

显然它似乎在“[[”和“]]”上失败了。

现在我也试过去掉双括号,只保留一个。

命令:

if [ "$message" =~ "$regular_expression" ];

错误:

.git/hooks/pre-push: line 6: [: =~: binary operator expected
This message is flawed: TRY-1 Sample

有人知道如何解决这个问题吗?

最佳答案

Windows 版 Git 附带的 bash 版本不支持 bash 条件表达式中的 =~ 结构。看起来 =~ 运算符是在 bash 3.0 中引入的,但是当 Git for Windows 使用 bash 3.1 时,它似乎缺少这个运算符。

可能 $(echo $message | grep "$regexp") 可以作为替代。例如:

$ bash -c '[[ "hello" =~ "^h" ]]'
bash: -c: line 0: conditional binary operator expected
bash: -c: line 0: syntax error near `=~'
bash: -c: line 0: `[[ "hello" =~ "^h" ]]'

$ bash -c '[ $(echo hello | grep "^h") ] && echo matched || echo nomatch'
matched

更新

这里是一个示例脚本,它可以使用 Git for Windows bash 来匹配类似的东西:

#!/bin/bash
#
# grep returns 0 on matching something, 1 whn it fails to match
msg='TEST-111 Sample'
re='([A-Z]{2,8}-[0-9]{1,4}[[:space:]])+[A-Za-z0-9]+[[:space:]]*[A-Za-z0-9]+$'
rx='^([A-Z]{2,8}-[0-9]{1,4})[[:space:]][[:alnum:]]+$'

echo $msg | grep -qE "$rx"
[ $? = 0 ] && echo matched || echo nomatch

此脚本使用第二个正则表达式返回与示例短语匹配的结果。它并不清楚原始表达式试图匹配什么——看起来像多个单词,所以我不确定你为什么不只匹配 .*$。但是,这显示了一种尝试正则表达式的方法。注意:我们使用的是扩展正则表达式 ([[:space:]]),因此我们必须使用 grep -E。此外,我们还必须注意引用,因为正则表达式中使用了 $

关于regex - 在 Windows 上执行 git-hooks 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30590260/

相关文章:

正则表达式检查重复

c# - 替换不区分大小写的正则表达式需要注意什么?

windows批量执行about调用命令

PHP 正则表达式将新行限制为最多两个

laravel - 我如何使用 laravel mix 和 git 管理前端 Assets ?

android - 我的 gitignore 不工作

javascript - 一行正则表达式,匹配所有由空格分隔的单词

java - 从Java中的字符串中删除所有非-"word characters",留下重音字符?

windows - 如何在 Windows 上从 git bash 运行 PHPUnit?

git - 在 git 中使用钩子(Hook)导入和导出到 csv