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

时间:2015-09-02 14:12:48

标签: git zsh git-branch parentheses

我尝试使用以下命令从master创建分支

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery
当Git突然停止响应时。我怀疑未经证实的()应该归咎于某种原因。现在,每当我尝试运行任何Git命令时,我都会得到同样的错误:

git:176: command not found: _of_ProductSearchQuery

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

任何人都能解释发生了什么吗?我该如何恢复正常?我想删除那个分支,但我该怎么办呢?

1 个答案:

答案 0 :(得分:613)

问题

  

任何人都能解释发生了什么吗? [...]我很乐意删除那个分支,但Git不会为我工作。

运行

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

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

functions

不幸的是,虽然其他两个shell函数没有问题,但 shell函数调用了" git"现在隐藏真正的 $ functions SSLOC-201_Implement___str__ () { _of_ProductSearchQuery } branch () { _of_ProductSearchQuery } git () { _of_ProductSearchQuery } 命令!

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)

每当您尝试运行Git命令时,例如command not found: _of_ProductSearchQuery git log等(当然,假设没有名为git status的命令)。

旁注

  

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

_of_ProductSearchQuery
     

(每次输入命令时git:176: command not found: _of_ProductSearchQuery 后面的数字都会增加)

该数字只对应于git的值,这是一个包含

的环境变量
  

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

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

解决方案

  

我该如何恢复正常?

只需删除有问题的shell函数(以及您偶然创建的其他两个函数,当您还在其中时):

$HISTCMD

然后一切都会好起来的。

如果unset -f git unset -f branch SSLOC-201_Implement___str__ 被遮蔽了怎么办?!

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

分支命名提示

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

是的,正如评论中所指出的,括号是Git分支名称中的有效字符;你只需要恰当地引用这个名字,例如

unset

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

使用简单的分支名称

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

这样的长描述
  

SSLOC-201_Implement ___ STR __()_ of_ProductSearchQuery

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