问题描述
我试图在位桶中创建分支时强制进行正则表达式匹配以保持一致的命名约定。
我的正则表达式要求:
- 以
feature/
或release/
开头- 必须紧跟
ABCD-
- 此后可以有任何数字(必须至少一位数字)
- 必须仅以数字结尾,不允许使用其他字符
我正在尝试的替代方法是
-
^(feature|release)\/(ABCD-\d+$).*
-
^(feature|release)\/(ABCD-\d+$)
应该工作正常,我检查了regex101
并且我的示例feature/ABCD-99
在此站点中匹配。
但是,当我在.git/hooks/pre-push
中使用相同的正则表达式时,即使提供了经过测试的示例,我的源树也会失败。即feature/ABCD-99
失败。
请帮助我理解,Regex在不同的站点/供应商处的行为是否有所不同?
我如何纠正我的正则表达式以使其适用于Atlassian Bitbucket(我正在使用SourceTree)。
在此处添加我的预推脚本:
#!/bin/sh
echo "inside pre-push hook"
local_branch="$(git rev-parse --abbrev-ref HEAD)"
echo "local branch is: $local_branch "
branch_regex="^(feature|release)\/(ABCD-\d+$).*"
if [[ ! $local_branch =~ $branch_regex ]]
then
echo "Bad naming convention of branch. Rejected"
exit 1
fi
exit 0
在源代码树中提供ABCD-99(有效方案正则表达式)时添加输出:
推送到git
内部预推钩
本地分支为:feature / ABCD-99
分支的错误命名约定。拒绝
解决方法
您看到的问题是因为您使用的是bash并且=~
匹配项需要POSIX扩展正则表达式。这意味着您可以使用像[0-9]
这样的字符类,但是不能使用像\d
这样的Perl兼容符号。通常,与Perl兼容的正则表达式非常强大,但是它们需要一个附加的库,而POSIX扩展正则表达式几乎可以在每个Unix系统上使用,因此它们更适合于bash之类的可移植shell。
所以您的正则表达式应该是这样的:^(feature|release)\/ABCD-[0-9]+$
。
请注意,[[
命令和对其的=~
操作符是bash扩展,在其他shell中找不到。使用它们很好,但是如果您想使用bash,则您的shebang必须为#!/bin/bash
(或#!/usr/bin/env bash
),因为/bin/sh
并非在所有系统(例如Debian,Ubuntu)上都是bash ,BSD和某些macOS系统)。编写此检查的POSIX方法是:
if ! echo "$local_branch" | grep -qsE "$branch_regex"
then
echo "Bad naming convention of branch. Rejected"
exit 1
fi
在Linux系统上,regex(7)
手册页描述了POSIX扩展(现代)和基本(过时)正则表达式所允许的语法。
经过大量脑力激荡和错误跟踪方法后,发现一些atlassian / bitbucket Git / Sourcetree如何不准备使用'\ d'来匹配正则表达式的数字,相反,它们只允许'[0-9 ]'
更改了以上代码,从
^(feature|release)\/(ABCD-\d+$)
至^(feature|release)\/(ABCD-[0-9]+$)
以使其正常工作。