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

时间:2010-09-06 13:33:16

标签: git branch naming

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

3 个答案:

答案 0 :(得分:252)

refname的命名规则:

  

Git对如何命名引用规定了以下规则:

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

  2.   
  3. 它们必须包含至少一个/。这会强制存在类似heads/tags/等类别,但实际名称不受限制。如果使用--allow-onelevel选项,则免除此规则。

  4.   
  5. 他们不能在任何地方连续两个点..

  6.   
  7. 它们不能包含ASCII控制字符(即值小于\040的字节,或\177 DEL),空格,代字号~,插入符号{ {1}}或冒号^

  8.   
  9. 他们不能在任何地方添加问号:,星号?或开括号*。有关此规则的例外情况,请参阅下面的[选项。

  10.   
  11. 它们不能以斜杠--refspec-pattern开头或结尾,也不能包含多个连续斜杠(有关此规则的例外情况,请参阅下面的/选项)

  12.   
  13. 它们不能以点--normalize

  14. 结尾   
  15. 它们不能包含序列..

  16.   
  17. 它们不能是单个字符@{

  18.   
  19. 它们不能包含@

  20.   

最重要的是,分支名称的附加规则:

  
      
  1. 他们无法以短划线\
  2. 开头   

感谢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'。理想情况下,您应避免使用任何符号。