分支名称中哪些字符是非法的?
答案 0 :(得分:252)
refname的命名规则:
Git对如何命名引用规定了以下规则:
它们可以包括用于分层(目录)分组的斜杠
/
,但没有斜杠分隔的组件可以以点.
开头或以序列.lock
结束。 / p>它们必须包含至少一个
/
。这会强制存在类似heads/
,tags/
等类别,但实际名称不受限制。如果使用--allow-onelevel
选项,则免除此规则。他们不能在任何地方连续两个点
..
。它们不能包含ASCII控制字符(即值小于
\040
的字节,或\177
DEL
),空格,代字号~
,插入符号{ {1}}或冒号^
。他们不能在任何地方添加问号
:
,星号?
或开括号*
。有关此规则的例外情况,请参阅下面的[
选项。它们不能以斜杠
--refspec-pattern
开头或结尾,也不能包含多个连续斜杠(有关此规则的例外情况,请参阅下面的/
选项)- 结尾
它们不能以点
--normalize
它们不能包含序列
..
。它们不能是单个字符
@{
。- 醇>
它们不能包含
@
。
最重要的是,分支名称的附加规则:
- 他们无法以短划线
开头 醇>\
感谢Jakub Narębski,-
的{{3}}有更多详情。
答案 1 :(得分:3)
接受的答案和 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 'Ω'
答案 2 :(得分:2)
此外,如果您考虑使用美元符号$
字符,则必须小心。
git branch pew$ign
将创建 pew 。为了创建其中包含$
的分支,应使用 quotes 包裹整个名称:git branch 'pewSign'
。理想情况下,您应避免使用任何符号。