复杂的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任何分支 。 相反,您意外地定义了三个名为git
, branch
和SSLOC-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 log
, git 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
属于提交消息,不在分支名称中。