Git 为什么可以';t分支名称包含';空间';烧焦

Git 为什么可以';t分支名称包含';空间';烧焦,git,git-branch,Git,Git Branch,我试过: git branch "MyProj/bin/ ignored" 并收到: fatal: 'MyProj/bin/ ignored' is not a valid branch name. 手册页指向手册页以获取有效分支名称的实际规则 果然,出现上述致命错误的原因似乎是包含了空格字符 你知道为什么在今天这个时代,空格仍然被排除在分支名称之外吗(例如,我在古代的CVS中会想到它,但是Git?) 什么是有效的技术原因?我不知道你是否会在这篇文章的底部找到纯粹的技术原因。但是,我可以指出

我试过:

git branch "MyProj/bin/ ignored"
并收到:

fatal: 'MyProj/bin/ ignored' is not a valid branch name.
手册页指向手册页以获取有效分支名称的实际规则

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

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


什么是有效的技术原因?

我不知道你是否会在这篇文章的底部找到纯粹的技术原因。但是,我可以指出,空格往往会在各种*nix实用程序和文件名处理中使用扳手,因此可能是为了避免在以后的过程中意外地出错。毕竟,git分支可以归结为repo中的一个文件,这避免了处理该文件名中的空格(具体来说,分支是.git/refs/heads/中的一个文件,如注释中所述)


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

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

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

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

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

例: 假设您当前有一个分支,尽管您现在处于主控中。如果你想运行这个命令

(大师):git签出-b我的修复

git不知道您是否想要创建一个名为“my fix”的新分支,或者您是否想要创建一个名为“my”的新分支,该分支链接到您原来的“fix”,而不是“master”分支


来源:(Git文档)

旧线程,但是嘿..
在mac上,我使用alt+space。它会添加一个无形的角色,这将为你做的把戏。注意:它不是一个“空间”,它是一个看不见的角色。视觉上是一样的,但实际上不一样。100%可能会把其他人搞糊涂,而且肯定会带来混乱,但是嘿,为了好玩。。为什么不呢?xD

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

因为在shell脚本中正确使用路径名很困难。从链接 手册页本身:

这些规则使基于shell脚本的工具能够轻松地解析引用 名称,使用引用名称时shell的路径名扩展 未加引号(错误),并避免在某些引用名称中出现歧义 表达式(见第(7)款):

另见:

基本问题是今天。其中包括换行符、制表符和转义字符 (包括显示时可执行命令的转义序列),其他 控制字符、空格(任意!)、前导破折号(-)、shell 非合法UTF-8字符串的元字符和字节序列

但是, 结合了Bourne shell语言的其他弱点,使 在shell中更难正确处理文件名和路径名。我 认为shell是一种合理的短脚本语言,如果使用得当, 但是对文件名的过度许可将简单的任务变成了复杂的任务 容易做错事


在后台,Git分支是
.Git/refs/heads/
中的一个简单文件,只包含它所指向的commit的SHA-1。正如@Shelhamer所说,在*nix中,文件名中的空格有点笨拙,所以Git只是避开了这个问题。这没有有效的技术原因。介于“我懒得支持这个”和“出于某些武断的原因,我坚信空格永远不应该是分支名称的一部分”之间。为了理智、简洁、可预测性(以及可移植性:对于在分支名称上注册的脚本,我只使用破折号(
-
)、小写(
[a-z]
)和数字(
[0-9]
)在分支名称中。没有下划线(
),也没有大写。为什么要让它变得更复杂呢?我也从不使用斜杠(
/
),因为它是分支“特殊”的有用指示。基本上没有理由使用“
/
”而不是“
-
”来代替它,除了帮助自动折叠它们的哑gui工具(如树),智能gui也可以/应该在破折号“
-
”上轻松完成。顺便说一句,有人指出,atlasian sourcetree在某些情况下无法读取名为“space”的分支。这是显而易见的,但使用它会有风险(或使同事恼火)。对于好奇的人:alt+space=Unicode字符“无中断空格”(U+00A0),除了你可以执行
git签出-b“我的修复”