【问题标题】:Why cannot the `~` tilde sign be part of a valid Git branch name?为什么 `~` 波浪号不能成为有效 Git 分支名称的一部分?
【发布时间】:2018-02-06 00:31:33
【问题描述】:

我试图用 ~ 波浪符号表示来自贡献用户的 Git 分支,类似于用于在类 UNIX 操作系统上引用主文件夹的符号,但 Git 阻止我这样做,因为它中止分支创建带有错误消息fatal: '~' is not a valid branch name. 贡献者的分支名称应类似于~alice/feature/foo~bob/bugfix/bar 等。

以下命令均不适用于 Git 版本 2.14.1:

$ git checkout -b '~'
fatal: '~' is not a valid branch name.
$ git checkout -b '~bar'
fatal: '~bar' is not a valid branch name.
$ git checkout -b 'foo~'
fatal: 'foo~' is not a valid branch name.
$ git checkout -b 'foo~bar'
fatal: 'foo~bar' is not a valid branch name.

目前,我决定将@ at 符号作为我的通用前缀。但是我正在重新考虑将相当不寻常的字符作为我的分支名称的一部分而不是- 连字符和_ 下划线符号作为单词分隔符的决定,因为Git 本身或底层文件系统a Git 可能施加的限制存储库恰好是例如签出并因此存储。

【问题讨论】:

  • 重复的问题链接需要再次审核。 git中的分支名称实际上是一个文件夹。 ~ 表示 unix 系统中的主目录。因此,该文件夹已经存在,因此 git 无法创建这样的分支。这个问答有一些细节stackoverflow.com/questions/2527355/…
  • @Eyorther ~ 是 linux 中一个非常合适的目录名。 mkdir \~ 就像一个魅力。
  • @CodeCaster 我投票决定重新提出这个问题,因为:1/ 我用建议的副本中不存在的信息来回答这个问题,并且 2/ 这不是一个完美的副本:OP 询问为什么它被禁止,如果被禁止,则不会。
  • @YSC mkdir ~ 和 mkdir /~,是有区别的。后者在根文件夹中创建一个目录~。
  • @Eyorther 主目录的波浪号名称是由 shell 管理的简写,而不是由系统或内核管理。 mkdir \~ 将使 shell 忽略波浪号并将名称 mkdir 作为第一个参数传递给 ~ 原样mkdir 完全能够创建一个名为~ 的目录。这对他来说毫无意义(它?)。

标签: git git-checkout


【解决方案1】:

The rules for reference names are given in the git check-ref-format manual page。波浪号~、克拉^ 和冒号: 字符是被禁止的,因为它们是解析引用时的句法项:master~3 表示从master 指向的提交倒数三个第一父母,例如, HEAD:path/to/blob 是当前提交中的 file (blob)。

【讨论】:

  • 但是,如果 Git 对分支名称中的特殊字符非常严格,为什么不禁止 @ at 符号,因为 @ 是符号的缩写参考HEAD?
  • 事实上@-as-a-whole is 被禁止(规则 9),@{ 也被禁止(规则 8)。 可以放宽规则,只禁止~后跟数字(或字符串结尾),因为this~that没有明确的含义,只有this~<optional-number>。然而,Git 目前似乎正朝着另一个方向发展(添加更多限制),可能是因为 Windows。
【解决方案2】:

git 引用(标记或分支)禁止包含波浪号 (~),因为此字符用于引用父提交:

  • ref~ref~1 的简写,表示 ref 的第一个父母;
  • ref~2 表示ref 的第二个父母;
  • ...

查看 Paul Boxley 的 Git caret and tilde 文章,快速了解 git 语法中波浪号和插入符号 (^) 的作用。

最后,您将在official documentation 中找到所有关于 git 语法的文档,用于引用提交。

【讨论】:

  • 我认为 OP 不喜欢这个答案(即使它是正确的)。正如我在对我的回答的评论中指出的那样,这可能不是一个很好的原因,但它(原始)原因。
猜你喜欢
  • 2011-12-10
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2021-09-01
  • 1970-01-01
  • 2012-09-17
  • 2011-09-30
相关资源
最近更新 更多