为什么分支名称不能包含“ space”字符?

我试过:

git branch "MyProj/bin/ ignored"

收到:

fatal: 'MyProj/bin/ ignored' is not a valid branch name.

蠢货手册页指向 Git-check-ref-format手册页,以获得有效分支名称的实际规则。

果然,出现上述致命错误的原因似乎是包含了一个空格字符。

知道为什么在今天这个时代,空格仍然被排除在分支名称之外吗(例如,我希望在古老的 CVS 中使用空格,但是 Git?)

有什么合理的技术原因吗?

60381 次浏览

我不知道你是否会找到一个纯粹的,技术性的原因在这个底部。然而,我可以提供的空格往往扔扳手在各种 * nix 实用程序和文件名处理,所以它可能是为了避免意外做任何错误的进一步发展。毕竟,git 分支归结为回购文件中的一个文件,这样就避免了处理该文件名中的空格(具体来说,分支就是。Git/refs/head/,如注释中提到的)。

大多数情况下,我认为原因是哲学上的,意味着让事情变得简单。分支名称是人类可读的名称,没有复杂的真正原因(每次都需要额外输入两个字符,哈哈,以调用系统管理员的幽灵,他将每个命令别名为一个难以辨认的三个字母组合)。也被称为“为什么 cd 不是 chdir”的论点。

如果你足够绝望,有一个可能的解决办法。Unicode 集中有许多类似空格的字符。但是只有 U + 0020是不允许的空间。例如,一个不换行空格,你可以有一个带空格的分支名称。主要问题是您的键盘可能没有该代码点的键。我使用下面的脚本来解决这个问题:

#!/bin/zsh
git co -b "${@// / }"

它只是将参数中的所有空格替换为非中断空格..。

这是不允许的,因为它会使“ git checkout”命令的功能复杂化。

假设您目前有一个名为“ fix”的分支,尽管您目前处于主控制中。如果您运行命令

Git checkout-b my fix

Git 不知道您是想要创建一个名为“ my fix”的新分支,还是想要创建一个名为“ my”的链接到原始“ fix”的新分支,而不是“ master”分支。

来源: https://git-scm.com/docs/git-checkout(Git 文档)

在 Mac 电脑上,我使用 Alt + Space来插入一个不可见的字符,这样做的诀窍。这个角色被称为不换行空格。(HTML 编码中的  ; 否则称为 U + 00 A0。对于其他平台,您可以从下面的代码片段中复制字符。)

这和一般的空间不一样。它是一个看不见的字符,看起来像一个空间,在许多情况下表现得像一个空间,但是是一个完全不同的字符。Git只有不允许使用普通的空格字符,所以它允许这样做。

使用这个100% 可能会迷惑其他任何人,并肯定会带来混乱无处不在,但你可以这样做,如果你真的想要。

git checkout -b US24024 Automated Tests - Profile A
Switched to a new branch 'US24024 Automated Tests - Profile A'

注意,不能从上面的代码块 (由于 Stack Overflow 中的限制)复制字符。要复制它,请运行下面的代码段并从文本框中复制:

<input type="text" size="1" value="&nbsp;" style="text-align: center;" readonly>
(Select and copy the contents of this text box.)

因为在 shell 脚本中正确使用路径名是很困难的 git check-ref-format 手册页本身:

这些规则使得基于 shell 脚本的工具很容易解析引用 当使用引用名称时,通过 shell 扩展路径名 未被引用(错误地) ,也避免在某些参考名称的歧义 表达式(见 gitAmendment (7)) :

另见 Shell 中的文件名和路径名: 如何正确使用:

最基本的问题是,现在大多数喜欢 Unix 的系统都允许包含文件名 几乎所有的字节 ,包括换行符、制表符和转义字符 (包括可以在显示时执行命令的转义序列) ,其他 控制字符,空格(任意位置!) ,前导破折号(-) ,shell 元字符和非合法 UTF-8字符串的字节序列。

...

然而,类 Unix 内核的这个缺陷(允许危险的文件名) 与 Bourne shell 语言中的其他弱点结合使用 更难在 shell 中正确处理文件名和路径名 认为 shell 是一种合理的短脚本语言,如果使用得当, 但是文件名的过度放任将容易的任务变成 容易完成的错误任务。