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

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

Git突然停止响应。我怀疑unescaping()在某种程度上是罪魁祸首。现在,每当我尝试运行任何Git命令时,我都会得到相同的错误:

git:176: command not found: _of_ProductSearchQuery

每次我输入一个命令,git后的数字都会增加。

有人能解释一下发生了什么吗?我怎么才能恢复正常?我想删除这个分支,但是我该怎么做呢?


问题

有人能解释一下发生了什么吗?[…我希望能够删除该分支,但Git不适合我。

通过运行

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

在zsh中,您没有创建任何分支。相反,您无意中定义了三个shell函数,分别称为git、branch和ssloc - 201_implement__str__,它们忽略了它们的参数(如果有的话),其主体是_of_ProductSearchQuery。你可以自己检查,这确实是发生了什么,通过调用内置的zsh命令函数,它列出了所有现有的shell函数:

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

不幸的是,尽管其他两个shell函数没有问题,但shell函数“git”现在掩盖了真正的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日志,Git状态等(当然,假设不存在名为_of_ProductSearchQuery的命令)。

边注

[…我得到了同样的错误: git:176: command not found: _of_ProductSearchQuery (每次我输入一个命令,git后的数字都会增加)

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

交互式shell中的当前历史事件号,换句话说,就是导致$HISTCMD被读取的命令的事件号。

更多细节请参阅zsh手册。

解决方案

我怎么才能恢复正常?

只需删除有问题的shell函数(以及其他两个您意外创建的函数):

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

那么一切都会好起来的。

如果未设置也是阴影呢?!

好问题!我推荐你参考下面Wumpus W. Wumbley的精彩评论。


Branch-naming技巧

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

是的,正如评论中指出的,括号在Git分支名称中是有效的字符;你只需要适当地引用名字就可以了。

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

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

使用简单的分支名称

无论如何,您都应该保持分支名称简短而温馨。冗长的描述,比如

_of_ProductSearchQuery ssloc - 201 _implement___str__ ()

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