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

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

 git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery 

当Git突然停止响应。 我怀疑这个非转义的()必须对它做些什么。 现在,每当我尝试运行任何Git命令,我都会得到相同的错误:

 git:176: command not found: _of_ProductSearchQuery 

(每次我input一个命令后git增加后的数字)

谁能解释发生了什么? 如何恢复正常? 我希望能够删除该分支,但Git不会为我工作。

问题

谁能解释发生了什么? […]我很想能够删除该分支,但Git不会为我工作。

通过运行

 git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery 

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

(每次我input一个命令后git增加后的数字)

这个数字只是对应于HISTCMD的值,这个环境variables是持有的

交互式shell中的当前历史事件编号,换句话说,引起$HISTCMD读取的命令的事件编号。

有关更多详细信息,请参阅zsh手册 。

如何恢复正常?

简单地删除有问题的shell函数(以及您在创build时碰巧创build的另外两个函数):

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

那么一切都应该没问题。

如果unset也被遮蔽了呢?!

好问题 ! 我把你推荐给下面的Wumpus W. Wumbley的出色评论 。


分支命名技巧

避免任何特殊的shell字符

是的,正如在注释中指出的,括号是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

属于提交消息,不在分支名称中。