【问题标题】:Why can't a branch name contain the 'space' char?为什么分支名称不能包含“空格”字符?
【发布时间】:2011-09-30 22:28:00
【问题描述】:

我试过了:

git branch "MyProj/bin/ ignored"

并收到:

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

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

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

知道为什么在当今时代,分支名称中仍会排除空格(例如,在古代 CVS 中我会想到它,但 Git?)

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

【问题讨论】:

  • 没有有效技术原因。它介于“我懒得支持这个”和“出于某些随意的原因我坚信空格不应该成为分支名称的一部分”之间。
  • 为了理智、简洁、可预测性(和可移植性:对于分支名称上的脚本正则表达式),我使用破折号(“-”),分支名称中的小写 ([a-z]) 和数字 ([0-9])。没有下划线(“_”),也没有大写。为什么让它比必要的复杂?我也从不使用斜杠(“/”),因为它是一个有用的指示分支是“特殊的”。基本上没有理由使用“/”而不是“-”,除了帮助愚蠢的 gui 工具自动将它们折叠起来(例如一棵树),智能 gui 可以/应该同样容易地做到这一点在破折号上“-”。

标签: git git-branch


【解决方案1】:

我不知道您是否会在本文的底部找到一个纯粹的技术原因。但是,我可以提出,空格往往会在各种 *nix 实用程序和文件名处理中引发麻烦,因此可能是为了避免意外地进一步做错事。毕竟,git 分支归结为 repo 中的一个文件,这避免了处理该文件名中的空格(具体来说,分支是 .git/refs/heads/ 中的文件,如评论中所述)。

我猜大部分原因是哲学上的,目的是让事情变得简单。分支名称是人类可读的名称,没有真正的复杂理由(并且每次都需要输入两个额外的字符,哈哈,以调用系统管理员的幽灵,他将每个命令都别名为难以理解的三个字母组合)。否则称为“为什么 cd 不是 chdir”论点。

【讨论】:

  • 在底层,Git 分支是.git/refs/heads/ 中的一个简单文件,仅包含它指向的提交的 SHA-1。正如@Shelhamer 所说,文件名中的空格在 *nix 中有点尴尬,所以 Git 只是回避了这一点。
【解决方案2】:

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

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

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

【讨论】:

  • 接受 git 方式可能比像这样使设置复杂化更好。
【解决方案3】:

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

例如: 考虑一下您当前有一个名为 的分支,尽管您当前在 master 中。如果你会运行命令

(master): git checkout -b my fix

git 不知道你是要创建一个名为“my fix”的新分支,还是要创建一个名为“my”的新分支,该分支链接到原来的“fix”,而不是“master”分支.

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

【讨论】:

  • 除了你可以做git checkout -b "my fix"
  • ……但我认为 Catalin 的观点是,你可能不会。
【解决方案4】:

旧线程,但是嘿..
在 Mac 上,我使用 alt + 空格。它会添加一个隐形角色,为您解决问题。注意:这不是一个“空间”,它是一个看不见的字符。视觉上相同的东西,但实际上不一样。 100% 的可能会把其他人搞得一团糟,而且肯定会在各处带来混乱,但是,嘿,为了好玩……为什么不呢? xD

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

【讨论】:

  • 顺便说一句,有人指出 atlasian sourcetree 在某些情况下无法读取名为“space”的分支。这很明显,但使用风险自负(或惹恼您的同事)。
  • 对于好奇的人:alt + 空格 = Unicode 字符 'NO-BREAK SPACE' (U+00A0)
【解决方案5】:

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

这些规则使基于 shell 脚本的工具可以轻松解析引用 名称,使用引用名称时由 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 对于短脚本来说是一种合理的语言,如果使用得当, 但是文件名的过度许可将简单的任务变成 容易做错的任务。

【讨论】:

  • 基于 2000 年代早期在“C:\Program Files\...”下默认安装所有可执行文件的决定,在 Windows 中存在无数严重的提升漏洞。最危险的是,将恶意 program.exe 放入根目录或通过此类别名进行访问时,请考虑。
  • ...Windows 注册表是此处不良行为者的关键促成因素,因为它大量使用 %ProgramFiles% 扩展,因为该标记适当地(但可能不那么明显)扩展为包含空格的序列.
猜你喜欢
  • 2023-03-16
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
相关资源
最近更新 更多