gpt4 book ai didi

python - 如何检查有效的 Git 分支名称?

转载 作者:IT老高 更新时间:2023-10-28 21:15:32 26 4
gpt4 key购买 nike

我正在开发 git post-receive hook in Python .数据在 stdin 上提供,行类似于

ef4d4037f8568e386629457d4d960915a85da2ae 61a4033ccf9159ae69f951f709d9c987d3c9f580 refs/heads/master

第一个哈希是旧引用,第二个是新引用,第三列是正在更新的引用。

我想将其拆分为 3 个变量,同时验证输入。 如何验证分支名称?

我目前正在使用以下正则表达式

^([0-9a-f]{40}) ([0-9a-f]{40}) refs/heads/([0-9a-zA-Z]+)$

这不接受所有可能的分支名称,如 man git-check-ref-format 所述.比如排除一个名为build-master的分支,是有效的。

加分

我实际上想排除任何以“build-”开头的分支。这可以在同一个正则表达式中完成吗?

测试

鉴于下面的出色答案,我编写了一些测试,可以在以下位置找到 https://github.com/alexchamberlain/githooks/blob/master/miscellaneous/git-branch-re-test.py .

状态:下面的所有正则表达式都无法编译。这可能表明我的脚本有问题或语法不兼容。

最佳答案

让我们剖析各种规则并从中构建正则表达式部分:

  1. 它们可以包含斜线 / 用于分层(目录)分组,但斜线分隔的组件不能以点 . 开头或以序列 .lock.

     # must not contain /.
    (?!.*/\.)
    # must not end with .lock
    (?<!\.lock)$
  2. 它们必须至少包含一个 /。这会强制存在诸如 head/、tags/等类别,但实际名称不受限制。如果使用了 --allow-onelevel 选项,则放弃此规则。

     .+/.+  # may get more precise later
  3. 它们不能在任何地方有两个连续的点..

     (?!.*\.\.)
  4. 它们不能有 ASCII 控制字符(即值低于 \040\177 DEL 的字节)、空格、波浪号 ~ 、插入符号 ^ 或冒号 : 任意位置。

     [^\000-\037\177 ~^:]+   # pattern for allowed characters
  5. 它们不能有问号?、星号* 或左括号[。有关此规则的异常(exception)情况,请参阅下面的 --refspec-pattern 选项。

     [^\000-\037\177 ~^:?*[]+   # new pattern for allowed characters
  6. 它们不能以斜杠 / 开始或结束,也不能包含多个连续的斜杠(请参阅下面的 --normalize 选项了解此规则的异常(exception)情况)

     ^(?!/)
    (?<!/)$
    (?!.*//)
  7. 它们不能以点结尾..

     (?<!\.)$
  8. 它们不能包含序列@{

     (?!.*@\{)
  9. 它们不能包含 \

     (?!.*\\)

将它们拼凑在一起,我们得到了以下怪物:

^(?!.*/\.)(?!.*\.\.)(?!/)(?!.*//)(?!.*@\{)(?!.*\\)[^\000-\037\177 ~^:?*[]+/[^\000-\037\177 ~^:?*[]+(?<!\.lock)(?<!/)(?<!\.)$

如果你想排除那些以 build- 开头的,那么只需添加另一个前瞻:

^(?!build-)(?!.*/\.)(?!.*\.\.)(?!/)(?!.*//)(?!.*@\{)(?!.*\\)[^\000-\037\177 ~^:?*[]+/[^\000-\037\177 ~^:?*[]+(?<!\.lock)(?<!/)(?<!\.)$

这也可以通过 merge 一些寻找常见模式的东西来优化:

^(?!@$|build-|/|.*([/.]\.|//|@\{|\\))[^\000-\037\177 ~^:?*[]+/[^\000-\037\177 ~^:?*[]+(?<!\.lock|[/.])$

关于python - 如何检查有效的 Git 分支名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12093748/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com