分支名称中的哪些字符是非法的?
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】:它不喜欢 > 或 ==> 或 ->
【讨论】:
以上是关于分支名称中的哪些字符是非法的?的主要内容,如果未能解决你的问题,请参考以下文章
System.ArgumentException 路径中的非法字符