git 分支命名的正则表达式

Regex for git branch naming

我正在寻找一个正则表达式来执行有效的 git 分支命名约定。

规则是

  1. 分支名称只能是mainmasterdevelopment
  2. 分支名称可以以featurestestsbugfixhotfix开头;后跟 / 描述、数字、-_ 或嵌套,但最多允许 2
  3. 一个分支名称可以以release/开头,然后是版本号,它可以有betaalpharc标签,带或不带数字。

以下是几个有效名称的示例

main
bugfix/user-list
bugfix/user_list
bugfix/123
bugfix/123/account-update
bugfix/123/account_update
bugfix/User_crud/account-update
bugfix/User_crud/account_update
tests/api
tests/123
tests/123/hello
release/1.0.1
release/1.0.1-beta1
release/1.0.1-beta
release/1.0.1-rc3

我写了这个正则表达式 (https://regex101.com/r/n0CAuM/1),但它并不匹配上面的所有示例

^(development|master|main|(((features|tests|bugfix|hotfix)\/(([0-9A-Za-z-_]+)|((\/[0-9A-Za-z-_]+)))|release\/(?:(\d+)\.)?(?:(\d+)\.)?(\d+)?(-(alpha|beta|rc)[0-9]))))

另请注意,我将在 bash 脚本中使用正则表达式,该脚本仅支持 POSIX 正则表达式引擎 .

您可以将所有 3 个部分的交替放在模式的各自部分。

对于分组,您可以使用捕获组代替非捕获组,对于数字使用 [0-9] 而不是 \d

如果最多1-2个部分,可以使用量词{1,2}

您可以将模式写为:

^(main|development|master|(features|tests|(bug|hot)fix)(\/[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*){1,2}|release\/[0-9]+(\.[0-9]+)*(-(alpha|beta|rc)[0-9]*)?)$
  • ^ 字符串开头
  • ( 开始外部分组以匹配 3 个允许模式中的 1 个
    • main|development|master 单个命名替代项中的匹配项 1
    • |
    • (features|tests|(bug|hot)fix)(\/[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*){1,2} 匹配功能的变体,测试并修复以下 / 而不是 -_ 并重复该部分 1 或 2 次
    • |
    • release\/[0-9]+(\.[0-9]+)*(-(alpha|beta|rc)[0-9]*)? 将发布分支的变体与可选的 alpha、beta 或 rc
    • 匹配
  • )关闭外分组
  • $ 字符串结束

看到一个regex demo and a Bash demo.

例子

array=(development main bugfix/user-list bugfix/user_list bugfix/123 bugfix/123/account-update bugfix/123/account_update bugfix/User_crud/account-update bugfix/User_crud/account_update tests/api tests/123 tests/123/hello release/1.0.1 release/1.0.1-beta1 release/1.0.1-beta release/1.0.1-rc3 bugfix/ bugfix/- bugfix/_ bugfix/-name bugfix/_name bugfix/-/name bugfix/-/- bugfix/-/_ release/v1.0.1)

for i in "${array[@]}"
do
    if [[ "$i" =~ ^(main|development|master|(features|tests|(bug|hot)fix)(/[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*){1,2}|release/[0-9]+(\.[0-9]+)*(-(alpha|beta|rc)[0-9]*)?)$ ]]; then
      echo "Match: "$i
  else
      echo "No match: "$i
  fi
done

输出

Match: development
Match: main
Match: bugfix/user-list
Match: bugfix/user_list
Match: bugfix/123
Match: bugfix/123/account-update
Match: bugfix/123/account_update
Match: bugfix/User_crud/account-update
Match: bugfix/User_crud/account_update
Match: tests/api
Match: tests/123
Match: tests/123/hello
Match: release/1.0.1
Match: release/1.0.1-beta1
Match: release/1.0.1-beta
Match: release/1.0.1-rc3
No match: bugfix/
No match: bugfix/-
No match: bugfix/_
No match: bugfix/-name
No match: bugfix/_name
No match: bugfix/-/name
No match: bugfix/-/-
No match: bugfix/-/_
No match: release/v1.0.1