我想在 git 提交消息中使用正则表达式,以便只允许某种格式的提交消息。我希望用户以格式输入提交消息。
示例
BLGR-1234 BUG Alignment fix
即
BLGR-1234 XXXX ZZZZZZ
其中
BLGR-1234
指的是 jira 票号,其中 BLGR 是硬编码文本
XXXX
可以是故事|BUGFIX|重构|合并|文档
ZZZZ
应该是推送内容的描述。
我正在使用以下正则表达式
commit_regex='(^|\s+)BLGR-[0-9]+ (STORY|BUGFIX|REFACTOR|MERGE|DOCUMENT)[[:blank:]](([a-zA-Z0-9]+)(\s|_)*)+'
但是使用上面的正则表达式,如果我输入提交消息为
'Not proper regex BLGR-1234 BUG Alignment fix'
,钩子将允许此提交消息。有人可以告诉我如何解决这个问题吗?
粘贴我的提交消息挂钩文件
#!/usr/bin/env bash
commit_regex='BLGR-[0-9]+[[:blank:]](STORY|BUGFIX|REFACTOR|MERGE|DOCUMENT)[[:blank:]](([a-zA-Z0-9]+)(\s|_)*)+'
error_msg="Commit message format is incorrect."
if ! grep -qE "$commit_regex" "$1"; then
echo "$error_msg" >&2
exit 1
fi
grep -E
不(可移植)支持像 \s
这样的 Perlism;您是否检查过如果手动运行此脚本是否有效?
此外,如果没有
-x
或 ^
和 $
锚点,您将检查正则表达式是否与任何输入行上的任何位置匹配,而不是检查它是否匹配整行 - 即使如此,grep
也可能是错误的工具以验证是否还有其他线路。
试试这个:
#!/usr/bin/env bash
awk '!/^[ \t]*BLGR-[0-9]+[ \t]+(STORY|BUGFIX|REFACTOR|MERGE|DOCUMENT)[ \t]+([a-zA-Z0-9]+[ \t_]*)+[ \t]*$/
|| NR>1 { exit 1 }' ||
{ echo "$0: Commit message format is incorrect." >&2
exit 1; }
这对于重复的空格比正则表达式更宽松;或许可以去掉可选的前导和尾随空白(尽管后者尤其可能难以排除故障)和可选的内部空白重复。