执行 git-hooks on windows 出错
Executing git-hooks on windows errors out
所以,
我写了一个简单的 git-hooks 用于预推送,它在 Linux 或 Mac 上工作得很好,但在 Windows 上不起作用。
脚本:
尝试将提交消息与正则表达式匹配,如果匹配则应该 return 0 否则退出。
根据我阅读的文章,他们说挂钩应该可以正常工作。
命令:
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
有人知道如何解决这个问题吗?
bash 条件表达式中的 =~
构造在 Git 随 Windows 一起提供的 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 来匹配类似的内容 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
此脚本 returns 使用第二个正则表达式匹配示例短语。它并不清楚原始表达式试图匹配什么——看起来像多个单词,所以我不确定你为什么不只匹配 .*$
。但是,这显示了一种尝试正则表达式的方法。注意:我们使用的是扩展正则表达式 ([[:space:]]
),因此我们必须使用 grep -E
。我们还必须注意引用,因为正则表达式中使用了 $
。
所以,
我写了一个简单的 git-hooks 用于预推送,它在 Linux 或 Mac 上工作得很好,但在 Windows 上不起作用。
脚本: 尝试将提交消息与正则表达式匹配,如果匹配则应该 return 0 否则退出。
根据我阅读的文章,他们说挂钩应该可以正常工作。
命令:
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
有人知道如何解决这个问题吗?
bash 条件表达式中的 =~
构造在 Git 随 Windows 一起提供的 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 来匹配类似的内容 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
此脚本 returns 使用第二个正则表达式匹配示例短语。它并不清楚原始表达式试图匹配什么——看起来像多个单词,所以我不确定你为什么不只匹配 .*$
。但是,这显示了一种尝试正则表达式的方法。注意:我们使用的是扩展正则表达式 ([[:space:]]
),因此我们必须使用 grep -E
。我们还必须注意引用,因为正则表达式中使用了 $
。