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

蓝咒 提交于 2020-03-05 21:39:42

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

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

当Git突然停止响应时。 我怀疑未转义的()应该归咎于某种原因。 现在,每当我尝试运行任何Git命令时,我都会收到同样的错误:

git:176: command not found: _of_ProductSearchQuery

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

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


#1楼

问题

谁能解释发生了什么? [...]我希望能够删除那个分支,但Git不适合我。

通过运行

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

在zsh中, 您没有创建任何分支 。 相反,你不小心定义了三个shell函数 ,称为gitbranchSSLOC-201_Implement___str__ ,它们忽略了它们的参数(如果有的话),它们的主体是_of_ProductSearchQuery 。 您可以通过调用名为functions的builtin zsh命令来自行检查这确实发生了什么,该命令列出了所有现有的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是一个环境变量

[t]交互式shell中的当前历史事件编号,换言之,导致$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

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!