【问题标题】:Complex Git branch name broke all Git commands复杂的 Git 分支名称破坏了所有 Git 命令
【发布时间】:2015-11-28 02:27:42
【问题描述】:

我试图使用以下命令从master 创建一个分支,

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

当 Git 突然停止响应时。我怀疑未转义的() 是罪魁祸首,不知何故。现在,每当我尝试运行任何 Git 命令时,都会收到相同的错误:

git:176: command not found: _of_ProductSearchQuery

git 后面的数字在我每次输入命令时都会增加。

谁能解释发生了什么?以及如何恢复正常?我想删除那个分支,但是我该怎么做呢?

【问题讨论】:

  • 我猜这与您的 zsh 环境有关,因为我能够在我的 bash shell 中运行创建分支而没有不良副作用(lubuntu 13.10),但是当我看到错误时我切换到我的完全香草 zsh
  • 在未来,引用看起来可疑的东西。 git branch "SSLOC-201_Implement___str__()_of_ProductSearchQuery" 工作得很好。
  • @Qix 最好完全避免有问题的字符。
  • @Jubobs 绝对是,虽然我见过某些公司使用这样奇怪的分支名称。
  • @DwightSpencer 您的链接是特定于 Bash 的,但这个问题是特定于 zsh 的。这个问题实际上并没有出现在 Bash 中。

标签: git zsh git-branch parentheses


【解决方案1】:

问题

谁能解释发生了什么? [...] 我希望能够删除该分支,但 Git 不适合我。

通过运行

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

在 zsh 中,你没有创建任何分支。相反,您不小心定义了三个 shell 函数,称为 gitbranchSSLOC-201_Implement___str__,它们忽略了它们的参数(如果有的话)并且其主体是 _of_ProductSearchQuery。您可以通过调用名为 functions 的内置 zsh 命令来检查自己是否确实发生了这种情况,该命令列出了所有现有的 shell 函数:

$ functions                                                     
SSLOC-201_Implement___str__ () {
    _of_ProductSearchQuery
}
branch () {
    _of_ProductSearchQuery
}
git () {
    _of_ProductSearchQuery
}

不幸的是,虽然其他两个 shell 函数没有问题,名为“git”的 shell 函数现在隐藏了 真正的git 命令!

$ which git
git () {
    _of_ProductSearchQuery
}
# but the real "git" is a binary file that lives in /usr/local/bin/git (or some similar path)

因此,您随后会收到错误

command not found: _of_ProductSearchQuery

每当您尝试运行 Git 命令时,例如git loggit status 等(当然,假设不存在名为 _of_ProductSearchQuery 的命令)。

旁注

[...] 我得到同样的错误:

git:176: command not found: _of_ProductSearchQuery

(每次输入命令,git 后面的数字都会增加)

该数字仅对应于 HISTCMD 的值,这是一个保存的环境变量

[t]交互式 shell 中的当前历史事件编号,即导致读取 $HISTCMD 的命令的事件编号。

有关详细信息,请参阅zsh manual

解决方案

我该如何恢复正常?

只需删除有问题的 shell 函数(以及您在使用它时意外创建的另外两个):

unset -f git
unset -f branch SSLOC-201_Implement___str__

那么一切都会好起来的。

如果unset 也被遮蔽了怎么办?!

Good question!我把你推荐给下面的Wumpus W. Wumbley's excellent comment


分支命名提示

避免使用任何特殊的 shell 字符

是的,正如 cmets 中所指出的,括号是 Git 分支名称中的有效字符;您只需要适当地引用名称,例如

$ git branch 'foo()bar'
$ git branch
  foo()bar
* master
$ git checkout 'foo()bar'
Switched to branch 'foo()bar'

但是,当用作命令行参数时,每次都需要引用此类名称,这应该会说服您在引用名称中避免使用括号。更一般地,您应该(尽可能)避免在 shell 中具有特殊含义的字符,以防止出现这样的意外。

使用简单的分支名称

无论如何,你应该保持你的分支名称简短而甜美。像

这样的长描述

SSLOC-201_Implement___str__()_of_ProductSearchQuery

属于提交消息,而不是分支名称。

【讨论】:

  • 该线程状态括号中没有任何内容是非法的。 Git 似乎很喜欢它。 Switched to a new branch 'abcd-()-foo'
  • 看起来不错;使用它们绝对不是一个好主意,但它们在技术上不是无效的。
  • 如果有人也通过创建所谓的 shell 函数来隐藏 unset 会发生什么? (这可能吗?)
  • @codroipo 哈!那是个很好的观点。是的,有可能,在这种情况下,您最好重新启动zsh
  • 您可以使用builtin unset。如果builtinunset 都被函数遮蔽,那么unfunction。如果那也消失了,unhash -f。如果这四个都消失了,然后重新启动 shell。
猜你喜欢
  • 2019-11-20
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多