分支名称中的哪些字符是非法的?

Posted

技术标签:

【中文标题】分支名称中的哪些字符是非法的?【英文标题】:Which characters are illegal within a branch name? 【发布时间】:2022-01-19 15:40:09 【问题描述】:

分支名称中哪些字符是非法的?

【问题讨论】:

根据***.com/questions/16862933/…的帖子,“,”逗号也是非法的。 【参考方案1】:

refname 的命名规则:

Git 对引用的命名方式施加了以下规则:

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

    它们必须至少包含一个/。这会强制出现heads/tags/ 等类别,但实际名称不受限制。如果使用--allow-onelevel 选项,则放弃此规则。

    它们不能在任何地方有两个连续的点..

    它们在任何地方都不能有 ASCII 控制字符(即值低于 \040\177 DEL 的字节)、空格、波浪号 ~、插入符号 ^ 或冒号 :

    它们不能在任何地方出现问号?、星号* 或左括号[。有关此规则的例外情况,请参阅下面的 --refspec-pattern 选项。

    它们不能以斜杠 / 开头或结尾,也不能包含多个连续的斜杠(请参阅下面的 --normalize 选项以了解此规则的例外情况)

    它们不能以点结尾.

    它们不能包含序列@

    它们不能是单个字符@

    它们不能包含\

除此之外,分支名称的附加规则:

    他们不能以破折号开头-

感谢Jakub Narębski,man page 为git check-ref-format 提供了更多详细信息。

【讨论】:

值得一提的是 '>' 是允许的,但是要在 bash 中切换到该分支,它需要使用前面的 '\' 进行转义 我对您链接的 手册页 中的规则 #2 感到困惑。它说“2。它们必须至少包含一个/。” 请解释一下?我的所有分支机构的名称中都没有/ @chharvey:没有/ 的“分支”会“自动”在其前面加上heads/。实际上:没有/,目前还不清楚它是一个分支还是一个标签或其他东西...... 这里是一个正则表达式 /^[\./]|\.\.|@|[\/\.]$|^@$|[~^:\x00- \x20\x7F\s?*[\\]/g 这将找到无效字符,因此您可以将它们替换为“-”或您想要的任何字符 另外值得注意的是,& 字符有时会导致 Windows 上的分支名称出现问题【参考方案2】:

接受的答案和man page 已经解释了哪些规则适用于 Git 分支名称。

在 Git 源码中,refname_disposition 数组用于确定如何处理refnames 中的各种字符。 数组中的索引对应ASCII codes,值表示ASCII字符的处理方式。

/*
 * How to handle various characters in refnames:
 * 0: An acceptable character for refs
 * 1: End-of-component
 * 2: ., look for a preceding . to reject .. in refs
 * 3: , look for a preceding @ to reject @ in refs
 * 4: A bad character: ASCII control characters, and
 *    ":", "?", "[", "\", "^", "~", SP, or TAB
 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
 */
static unsigned char refname_disposition[256] = 
    1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
;

由于4 表示相应的ASCII 字符不允许出现在分支名称中,因此有39 个不允许的字符。 不允许使用的字符是 ASCII 控制字符(ASCII 码 : ? [ \ ^ ~ 和空白/制表符。

3更多字符需要满足一些条件(见doc注释):

.: 后面两个点是禁止的。 :子字符串@被禁止。 *:除非设置了REFNAME_REFSPEC_PATTERN,否则拒绝。

空字节终止分支名称,/ 为分支创建新的目录层次结构。 因此,分支名称不能以斜杠结尾。 比如git checkout -b 'a/b/c'会在.git/refs/heads下创建对应的目录结构

注意UTF-8 字符可以用于分支名称:

$ git checkout -b $'\xCE\xA9'
Switched to a new branch 'Ω'

【讨论】:

【参考方案3】:

此外,如果您考虑使用美元符号$ 字符,则必须小心。 git branch pew$ign 将创建 pew。为了创建一个包含$ 的分支,整个名称应包含在引号中:git branch 'pewSign'。理想情况下,您应该避免使用任何符号。

【讨论】:

这不是特定于 Git 的——它是 POSIX shell 如何处理命令的一部分。当你没有引号(或前面的反斜杠)时,$ign 被解释为一个空的 shell 变量,所以 git 只看到 'pew'。【参考方案4】:

它不喜欢 > 或 ==> 或 ->

【讨论】:

以上是关于分支名称中的哪些字符是非法的?的主要内容,如果未能解决你的问题,请参考以下文章

url的非法字符都有哪些

windows路径非法字符都有哪些

System.ArgumentException 路径中的非法字符

JAVA 非法字符的问题-问题解决了,绝对加分!!!

Rancher 模板 - 主机名中的 Hadoop 非法字符

非法语法需要有效的起始名称字符