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

5fjcxozz  于 2022-11-27  发布在  Git
关注(0)|答案(5)|浏览(158)

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

gj3fmq9x

gj3fmq9x1#

refname的命名规则:
Git对引用的命名方式施加了以下规则:
1.它们可以包含斜线/以进行分层(目录)分组,但斜线分隔的组件不能以点.开始或以序列.lock结尾。
1.它们必须至少包含一个/。这会胁迫heads/tags/等类别的存在,但实际名称不受限制。如果使用--allow-onelevel选项,则会放弃此规则。
1.它们在任何地方都不能有两个连续的点..
1.它们在任何地方都不能有ASCII控制字符(即值小于\040\177DEL的字节)、空格、波浪号~、脱字符^或冒号:
1.它们在任何位置都不能有问号?、星号*或左括号[。请参阅下面的--refspec-pattern选项以了解此规则的例外情况。
1.它们不能以斜杠/开始或结尾,也不能包含多个连续的斜杠(有关此规则的例外情况,请参阅下面的--normalize选项)
1.它们不能以点.结尾
1.它们不能包含序列@{
1.它们不能是单个字符@
1.它们不能包含\
除此之外,分支名称的附加规则:
1.它们不能以破折号-开头
由于Jakub Narębskigit check-ref-formatman page具有更多细节。

9rbhqvlz

9rbhqvlz2#

接受的答案和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代码〈32)、可打印字符: ? [ \ ^ ~和空格/制表符。

  • 3* 更多字符需要满足一些条件(参见 * 文档注解 *):
  • .:禁止两个连续的点。
  • {:子字符串@{是禁止的。
  • *:拒绝,除非设置了REFNAME_REFSPEC_PATTERN

空字节终止分支名称,/为分支创建新的目录层次。因此,分支名称不能以斜杠结尾。例如,git checkout -b 'a/b/c'将在.git/refs/heads下创建相应的目录结构
请注意,分支名称中可以使用UTF-8字符:

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

laik7k3q3#

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

drnojrws

drnojrws4#

它不喜欢〉或==〉或-〉

92vpleto

92vpleto5#

要完成main answer by Manoj Govindan

  • @是有效的分支名称(在git版本git version 2.24.3 (Apple Git-128)上)
  • HEAD不是一个有效的分支名称(由船长明显!)
  • 长度受限(受操作系统限制,在 Mac OS 10.15.7 上,最多250个字符,ASCII或非ASCII均可)

相关问题