为什么分支名称不能包含'space'char?

时间:2011-07-08 01:37:09

标签: git git-branch

我试过了:

git branch "MyProj/bin/ ignored"

并收到:

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

git-branch手册页指向git-check-ref-format手册页以获取有效分支名称的实际规则。

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

任何想法为什么,在这个时代,空间仍然被排除在分支名称之外(例如,我会在古老的CVS中预期它,但是Git?)

这可能是有效的技术原因吗?

5 个答案:

答案 0 :(得分:56)

我不知道你是否会在最底层找到一个纯粹的技术理由。但是,我可以提供空间倾向于在各种* nix实用程序和文件名处理中抛出扳手,因此可能是为了避免在进一步的行中意外地做错了。毕竟,git分支归结为repo中的文件,这避免了处理该文件名称中的空格(具体而言,分支是.git / refs / heads /中的文件,如注释中所述)。

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

答案 1 :(得分:4)

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

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

它只是用不间断的空格替换参数中的所有空格......

答案 2 :(得分:4)

老线程,但是嘿..
在Mac上我使用alt +空格。它会添加一个看不见的角色,为你做到这一点。心灵:它不是一个空间,它是一个看不见的角色。视觉上是一样的东西,但实际上并不相同。 100%的人可能会混淆其他人的地狱,并且肯定会在各处带来混乱,但是,嘿,为了踢...为什么不呢? xD

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

答案 3 :(得分:1)

不允许这样做,因为它会使" git checkout"的功能复杂化。命令。

例: 考虑到您目前有一个名为的分支,尽管您目前在主人中。如果你要运行命令

  

(主):git checkout -b my fix

git不知道你是否想创建一个名为" my fix"或者如果你想创建一个名为" my"这与您的原始"修复"相关联,而不是" master"分支。

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

答案 4 :(得分:0)

因为很难在Shell脚本中正确使用路径名。从链接 git check-ref-format手册页本身:

  

这些规则使基于Shell脚本的工具易于解析参考   名称,使用引用名称时外壳扩展路径名   未加引号(错误),并且避免在某些参考名称中出现歧义   表达式(请参见gitrevisions(7)):

另请参阅Filenames and Pathnames in Shell: How to do it Correctly

  

基本问题是今天most Unix-likes allow filenames to include almost any bytes。其中包括换行符,制表符,转义符   (包括在显示时可以执行命令的转义序列),其他   控制字符,空格(任何位置!),前划线(-),shell   元字符和不是合法UTF-8字符串的字节序列。

...

  

但是,这个flaw in Unix-like kernels (allowing dangerous filenames)   结合了Bourne Shell语言的其他弱点,使其成为   在Shell中,更难正确地处理文件名和路径名。一世   认为Shell是短脚本的合理语言,如果使用得当,   但是文件名的过度宽容将简单的任务变成   容易出错的任务。