复杂的Git分支名称破坏了所有Git命令

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

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

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

git:176: command not found: _of_ProductSearchQuery

每次键入命令时,git后面的数字都会增加。

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

19856 次浏览

问题

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

通过运行

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

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

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

不幸的是,尽管其他两个shell函数没有问题,shell函数称为“git”现在隐藏真正的 git命令! . c

$ 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的值,这是一个保存的环境变量

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

更多细节请参见zsh手册

解决方案

我怎么才能恢复正常?

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

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

那么一切都会好起来的。

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

很好的问题 !我建议你参考下面的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__ ()

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