分支名称中的哪些字符是非法的?
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ębski,git check-ref-format的man page具有更多细节。
/
.
.lock
heads/
tags/
--allow-onelevel
..
\040
\177
DEL
~
^
:
?
*
[
--refspec-pattern
--normalize
@{
@
\
-
git check-ref-format
9rbhqvlz2#
接受的答案和man page已经解释了哪些规则适用于Git分支名称。在Git源代码中,refname_disposition数组用于确定如何处理refnames中的各种字符。数组中的索引对应于ASCII codes,值指示如何处理ASCII字符。
refnames
/* * 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)、可打印字符: ? [ \ ^ ~和空格/制表符。
4
: ? [ \ ^ ~
{
REFNAME_REFSPEC_PATTERN
空字节终止分支名称,/为分支创建新的目录层次。因此,分支名称不能以斜杠结尾。例如,git checkout -b 'a/b/c'将在.git/refs/heads下创建相应的目录结构请注意,分支名称中可以使用UTF-8字符:
git checkout -b 'a/b/c'
.git/refs/heads
UTF-8
$ git checkout -b $'\xCE\xA9' Switched to a new branch 'Ω'
laik7k3q3#
此外,如果考虑使用美元符号$字符,则必须小心。git branch pew$ign将创建pew。为了创建一个包含$的分支,整个名称应该用 * 引号 * 括起来,使其成为字符串文字:git branch 'pew$ign'。理想情况下,应避免使用任何符号。
$
git branch pew$ign
pew
git branch 'pew$ign'
drnojrws4#
它不喜欢〉或==〉或-〉
92vpleto5#
要完成main answer by Manoj Govindan:
git version 2.24.3 (Apple Git-128)
HEAD
5条答案
按热度按时间gj3fmq9x1#
refname的命名规则:
Git对引用的命名方式施加了以下规则:
1.它们可以包含斜线
/
以进行分层(目录)分组,但斜线分隔的组件不能以点.
开始或以序列.lock
结尾。1.它们必须至少包含一个
/
。这会胁迫heads/
、tags/
等类别的存在,但实际名称不受限制。如果使用--allow-onelevel
选项,则会放弃此规则。1.它们在任何地方都不能有两个连续的点
..
。1.它们在任何地方都不能有ASCII控制字符(即值小于
\040
或\177
DEL
的字节)、空格、波浪号~
、脱字符^
或冒号:
。1.它们在任何位置都不能有问号
?
、星号*
或左括号[
。请参阅下面的--refspec-pattern
选项以了解此规则的例外情况。1.它们不能以斜杠
/
开始或结尾,也不能包含多个连续的斜杠(有关此规则的例外情况,请参阅下面的--normalize
选项)1.它们不能以点
.
结尾1.它们不能包含序列
@{
。1.它们不能是单个字符
@
。1.它们不能包含
\
。除此之外,分支名称的附加规则:
1.它们不能以破折号
-
开头由于Jakub Narębski,
git check-ref-format
的man page具有更多细节。9rbhqvlz2#
接受的答案和man page已经解释了哪些规则适用于Git分支名称。
在Git源代码中,refname_disposition数组用于确定如何处理
refnames
中的各种字符。数组中的索引对应于ASCII codes,值指示如何处理ASCII字符。由于
4
表示相应的ASCII字符不允许在分支名称中使用,因此有 39 个不允许使用的字符。不允许使用的字符包括ASCII控制字符(ASCII代码〈32)、可打印字符: ? [ \ ^ ~
和空格/制表符。.
:禁止两个连续的点。{
:子字符串@{
是禁止的。*
:拒绝,除非设置了REFNAME_REFSPEC_PATTERN
。空字节终止分支名称,
/
为分支创建新的目录层次。因此,分支名称不能以斜杠结尾。例如,git checkout -b 'a/b/c'
将在.git/refs/heads
下创建相应的目录结构请注意,分支名称中可以使用
UTF-8
字符:laik7k3q3#
此外,如果考虑使用美元符号
$
字符,则必须小心。git branch pew$ign
将创建pew
。为了创建一个包含
$
的分支,整个名称应该用 * 引号 * 括起来,使其成为字符串文字:git branch 'pew$ign'
。理想情况下,应避免使用任何符号。drnojrws4#
它不喜欢〉或==〉或-〉
92vpleto5#
要完成main answer by Manoj Govindan:
@
是有效的分支名称(在git版本git version 2.24.3 (Apple Git-128)
上)HEAD
不是一个有效的分支名称(由船长明显!)