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

lun*_*dov 238 git branch naming

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

Man*_*dan 273

命名规则

Git对引用的命名方式规定了以下规则:

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

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

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

  4. 它们不能具有ASCII控制字符(即值小于\040或等于的字节\177 DEL),空格,波浪号~,插入符号^或冒号:.

  5. 它们不能在任何地方都有问号?,星号*或开括号[.有关--refspec-pattern此规则的例外情况,请参阅下面的选项.

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

  7. 它们不能以点结尾 ..

  8. 它们不能包含序列@{.

  9. 他们不能是单一的角色@.

  10. 他们不能包含\.

感谢的JakubNarębski,该手册页-细节更加丰富.

  • 值得一提的是'>'是允许的,但是要在bash中切换到那个分支,它需要使用前面的'\'进行转义 (7认同)
  • @chharvey:一个没有`/`的"分支"有"head /`自动"前置".实际上:没有`/`,目前尚不清楚它是否是分支或标签或其他东西...... (7认同)
  • 我对**链接的**手册页中的规则#2感到困惑.它说*"2.它们必须包含至少一个`/`.**请解释一下?我的所有分支都没有名称中的`/`. (3认同)
  • 还值得注意的是 `&` 字符有时会导致 Windows 上的分支名称出现问题 (3认同)
  • 这是一个正则表达式/^ [\./] | \.\.| @ {| [/.\.] $ | ^ @ $ | [〜^:@ x00-\x20\x7F\s? [\\\]/g这将找到无效字符,因此您可以用' - '或任何您想要的字符替换它们 (2认同)
  • @neslekkiM bash 可能会将分号解释为新指令...您是否尝试过像“\;”一样转义它? (2认同)

upe*_*upe 12

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

\n

在 Git 源代码中,refname_disposition数组用于确定如何处理 中的各种字符refnames。\n数组中的索引对应于ASCII 码,值表示如何处理 ASCII 字符。

\n
/*\n * How to handle various characters in refnames:\n * 0: An acceptable character for refs\n * 1: End-of-component\n * 2: ., look for a preceding . to reject .. in refs\n * 3: {, look for a preceding @ to reject @{ in refs\n * 4: A bad character: ASCII control characters, and\n *    ":", "?", "[", "\\", "^", "~", SP, or TAB\n * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set\n */\nstatic unsigned char refname_disposition[256] = {\n    1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n    4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4\n};\n
Run Code Online (Sandbox Code Playgroud)\n

由于4表示分支名称中不允许使用相应的 ASCII 字符,因此有39 个不允许的字符。\n不允许的字符是 ASCII 控制字符(ASCII 代码 < 32)、可打印字符: ? [ \\ ^ ~和空格/制表符。

\n

另外3 个字符需要满足一些条件(请参阅文档注释):

\n
    \n
  • .:禁止连续两个点。
  • \n
  • {: 子字符串@{被禁止。
  • \n
  • *:除非REFNAME_REFSPEC_PATTERN设置否则拒绝。
  • \n
\n

空字节终止分支名称并/为分支创建新的目录层次结构。\n因此分支名称不能以斜杠结尾。\n例如git checkout -b \'a/b/c\'将在下创建相应的目录结构.git/refs/heads

\n

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

\n
$ git checkout -b $\'\\xCE\\xA9\'\nSwitched to a new branch \'\xce\xa9\'\n
Run Code Online (Sandbox Code Playgroud)\n