git commit消息的Regex帮助

qnyhuwrf  于 2023-08-08  发布在  Git
关注(0)|答案(1)|浏览(130)

我想创建一个正则表达式来强制执行git提交消息。样式如下:

<type>(<scope>): <subject>

<body>

BREAKING CHANGE: <breaking>

Refs: <references>

字符串
须符合以下条件:
1.()是可选的。
1.可以与段落多行,并且应该仅匹配到BREAKING CHANGE/Refs之前。
1.是可选的。
问题是:3. BREAKING CHANGE和Refs是可选的,因此当且仅当这两者不存在时,body必须匹配到末尾。
我的当前正则表达式:

/
(?<type>feat|fix|docs|style|refactor|perf|test|chore) -> Type

(?<scope>\(.+\))?: (?<subject>.{3,50}) -> Scope and Subject

(?:(?:\n\n(?<body>[\w\W]{3,}))? -> Body (how to match until the end, or stop if it sees BREAKING CHANGE or Refs?)

(?:\n\nBREAKING CHANGE: (?<breaking> [\w\W]{3,}))?

(?:\n\nRefs: (?<footer> [\w\W]{3,}))?
/gm


这可能吗?我尝试使用命名捕获来提取提交消息的不同部分,同时测试其有效性。
下面是一些好的提交消息的例子:

feat(stuff): add feature

Body text and stuff
Multiline body

x

feat(stuff): add feature

Body text and stuff
Multiline body

BREAKING CHANGE: Some breaking thing
feat(stuff): add feature

Body text and stuff
Multiline body

Refs: Closes issue #270

的一种或多种

0yycz8jy

0yycz8jy1#

我最终选择了以下代码,因为Gitlab不允许lookaheads/lookbehinds。这允许任意长的主体以及键:值页脚。

^(?:Initial commit\.?|Merge [^\r\n]+|(?P<type>build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(?:\((?P<scope>[\w-]+)\))?(?P<breaking>!)?: (?P<desc>.{3,50})(?P<body>[\w\s,'.`\[\]-]+)?(?P<footer>(?:\n(?:(?:[\w\s-]+): (?:[\w\s -`]+))+)|$))

字符串
注意这个正则表达式是针对Gitlab compatible RE2的。
在这里测试:regex101.com/r/n7M4tw/1

相关问题