当Git突然停止响应时,我试图使用以下命令从master创建分支:

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery


。我怀疑某种原因归咎于未转义的()。现在,每当我尝试运行任何Git命令时,都会遇到相同的错误:

git:176: command not found: _of_ProductSearchQuery


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

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

评论

我想这与您的zsh环境有关,因为我能够在bash shell中运行创建分支而没有不良副作用(lubuntu 13.10),但是当我切换到完全香草的zsh <时,我看到了错误br />
将来,请引用看起来可疑的内容。 git branch“ SSLOC-201_Implement ___ str __()_ of_ProductSearchQuery”可以正常工作。

@Qix最好完全避免出现有问题的字符。

@Jubobs绝对可以,尽管我已经看到某些公司强制使用这种奇怪的分支机构名称。

@DwightSpencer您的链接特定于Bash,但此问题特定于zsh。该问题实际上并没有在Bash中发生。

#1 楼

问题


有人可以解释发生了什么吗? [...]我很希望能够删除该分支,但Git不能为我工作。


通过运行

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery


在zsh中,您没有创建任何分支。相反,您无意中定义了三个壳函数,分别称为gitbranchSSLOC-201_Implement___str__,它们忽略了它们的参数(如果有)并且其主体为_of_ProductSearchQuery。您可以通过调用内置的qsh命令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


(每次我键入命令时,git之后的数字都会增加)


该数字简单地对应到环境变量HISTCMD的值,该环境变量在交互式外壳中保存当前历史事件编号,换句话说,导致$HISTCMD为请阅读。


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

解决方案



我该如何返回正常吗?


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

 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



的详细描述属于提交消息,而不是分支名称。

评论


该线程状态中的任何内容均禁止非法。 Git似乎很好。切换到新的分支'abcd-()-foo'

– Qix-蒙尼卡(MS)被盗
2015年9月2日14:48



看起来不错;使用它们绝对不是一个好主意,但是从技术上讲它们并不是无效的。

– Qix-蒙尼卡(MS)被盗
2015年9月3日在7:33



如果有人还通过创建所谓的shell函数来掩盖未设置状态,会发生什么情况? (这可能吗?)

–马特奥·乌米利(Matteo Umili)
2015年9月3日15:52



@codroipo哈!那是个很好的观点。是的,这是有可能的,在这种情况下,最好重新启动zsh。

–jub0bs
2015年9月3日15:53



您可以使用内置未设置。如果内置和未设置都已被函数遮盖,则无法运行。如果也没有,请取消哈希-f。如果所有四个都不用了,请重新启动外壳。

–user2404501
2015年9月8日下午13:31