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

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

120645 次浏览

refname命名规则:

Git对引用的命名规则如下:

  1. 它们可以包含斜杠/用于分层(目录)分组,但没有斜杠分隔的组件可以以点.开始或以序列.lock结束。

  2. 它们必须至少包含一个/。这将强制存在诸如heads/tags/等类别,但实际名称不受限制。如果使用了--allow-onelevel选项,则该规则将被放弃。

  3. 它们不能在任意位置有两个连续的点..

  4. 它们不能包含ASCII控制字符(即值低于\040\177 DEL的字节)、空格、波浪号~、插入号^或冒号:

  5. 它们不能在任何位置有问号?、星号*或开括号[。请参阅下面的--refspec-pattern选项以获得该规则的例外。

  6. 它们不能以斜杠/开始或结束,也不能包含多个连续的斜杠(参见下面的--normalize选项查看此规则的例外)

  7. 不能以点.结尾

  8. 不能包含序列@{

  9. 它们不能是单个字符@

  10. 它们不能包含\

在此之上,分支名称的附加规则:

  1. 它们不能以破折号-开头

多亏了Jakub Narębskigit check-ref-format手册页有了更多的细节。

另外,如果你考虑使用美元符号$字符,必须小心。

git branch pew$ign将创建pew

为了创建一个包含$的分支,整个名称应该包装在报价中,使其成为字符串字面量:git branch 'pew$ign'。理想情况下,你应该避免使用任何符号。

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

在Git源代码中,refname_disposition数组用于确定如何处理refnames中的各种字符。 数组中的索引对应于ASCII码,其值表示如何处理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

null字节终止分支名称,/为分支创建一个新的目录层次结构。 因此,分支名称不能以斜杠结尾。 例如,git checkout -b 'a/b/c'将在.git/refs/heads

下创建相应的目录结构

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

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

它不喜欢>或= =比;或→

要完成主要答案由Manoj Govindan:

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