当前位置: 首页 > 面试题库 >

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

章昱
2023-03-14
问题内容

我正在git post- receive用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. 它们必须至少包含一个/。这会强制出现诸如heads /,tags /等类别,但是实际名称不受限制。如果使用该--allow-onelevel选项,则该规则将被放弃。

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

     (?!.*\.\.)
    
  4. 它们不能在任何地方具有ASCII控制字符(即值小于\040或的字节\177 DEL),空格,代字号~,插入符^或冒号:

     [^\000-\037\177 ~^:]+   # pattern for allowed characters
    
  5. 他们在任何地方都不能有问号?,星号*或方括号[。请参阅以下--refspec-pattern选项,了解此规则的例外情况。

     [^\000-\037\177 ~^:?*[]+   # new pattern for allowed characters
    
  6. 它们不能以斜杠开头或结尾,也不能/包含多个连续的斜杠(有关--normalize此规则的例外,请参阅下面的选项)

     ^(?!/)
    

    (?<!/)$
    (?!.*//)

  7. 它们不能以点结尾.

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

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

     (?!.*\\)
    

将所有这些拼凑在一起,我们得出以下怪异现象:

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

而且,如果您要排除以这些开头的内容,build-则只需添加另一个前行即可:

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

可以通过合并一些寻找通用模式的东西来对此进行优化:

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


 类似资料:
  • 我在进行git克隆时遇到此错误 错误:- 尝试重新安装git(最新) 还是相同的错误 操作系统:-Windows

  • 这里是错误: 为什么字母*不匹配任何东西??

  • 我有四个分支,如master->origin/regacy,FeatureA->origin/FeatureA。如你所见,我打错了名字。 因此我想重命名一个远程分支名称(origin/regacy origin/legacy或origin/master) 但Git console向我返回了一条错误消息。 我该如何解决这个问题呢?

  • 我不想重命名远程分支,如重命名本地和远程Git存储库的主分支中所述。 如何重命名尚未推送到远程分支的本地分支? 如果您还需要重命名远程分支:如何重命名Git本地和远程分支名称

  • 所以问题是:git分支名称中的最大字符数是多少?它取决于系统吗?是否可以在远程存储库(即Github)上拒绝的存储库中创建长分支名?

  • 问题内容: 检查URL在Java中是否有效的最佳方法是什么? 如果试着拨打和赶上,但它似乎很乐意与任何开头。 我不关心建立连接,只是有效性。有办法吗?Hibernate Validator中的注释?我应该使用正则表达式吗? 编辑:和 URL的一些示例。 问题答案: 考虑使用Apache Commons UrlValidator类 有几个属性,您可以设置来控制如何类的行为,在默认情况下,和被接受。

  • 问题内容: 我需要一个正则表达式或PHP中的函数来验证字符串是否是一个很好的XML元素名称。 表格w3schools: XML元素必须遵循以下命名规则: 名称可以包含字母,数字和其他字符 名称不能以数字或标点符号开头 名称不能以字母xml(或XML或Xml等)开头 名称不能包含空格 我可以编写一个基本的正则表达式来检查规则1,2和4,但是它不能解决所有允许的标点符号,也不能解决第三条规则 友善更新

  • 我有一个Jenkins管道工作,它被配置为检查一个git回购和一个特定的本地分支。 两个值都为“null”