zsh无法识别HEAD ^

时间:2014-10-10 04:53:16

标签: cygwin zsh prezto

我正在使用zsh和prezto与cygwin。当我输入这个git命令'git reset HEAD5'时,zsh找不到HEAD ^。 但是,当我切换到使用bash时,它可以工作。

$ git reset HEAD^                                        
zsh: no matches found: HEAD^

有没有人见过同样的问题?

3 个答案:

答案 0 :(得分:9)

{1}}字符在zsh中的文件名扩展中被视为特殊字符,但仅在设置了^选项时才会被视为:

EXTENDED_GLOB

Bash没有此功能。 (确切地说,bash确实有一个扩展的glob功能,由zsh% setopt noEXTENDED_GLOB zsh% echo HEAD^ HEAD^ zsh% setopt EXTENDED_GLOB zsh% echo HEAD^ zsh: no matches found: HEAD^ zsh% 启用,但是bash的扩展glob语法不会将shopt -s extglob字符视为特殊字符。)

启用此功能后,^是一个与^类似的特殊字符,但含义不同。与*类似,您可以通过将其括在单引号或双引号中或者在其前面加上反斜杠来禁止它的特殊含义。报价是最简单的解决方案。

而不是

*

试试这个:

git reset HEAD^

git reset 'HEAD^' 通配符的含义不相关,因为您需要做的就是避免使用它,但无论如何我都会提到它。根据zsh手册,^匹配模式^X之外的任何内容。对于X的情况,HEAD^后面没有任何内容 - 这意味着^匹配HEAD^后跟任何其他内容。这是一种迂回的说法,HEAD匹配以HEAD^开头的文件名,后跟一些非空字符串。给定文件HEADHEADHEAD1,模式HEAD2匹配HEAD^HEAD1

答案 1 :(得分:3)

oh-my-zsh的

issue 449描述了这种确切的行为并提供了解决方案。

罪魁祸首是zsh上的选项extended_glob。 Presto必须设置它。因此,当您键入HEAD^时,zsh尝试创建一个glob否定表达式并失败并显示错误。

换句话说,setopt extended_glob允许我们使用^来否定全局。

要解决此问题,您可以在.zshrc上写下这一行:

unsetopt nomatch 

通过以上这一行,我们说zsh我们希望当模式匹配失败时,只需使用命令"原样"。

答案 2 :(得分:1)

避免使用^字符的快速解决方法是使用git reset head~1代替git reset head^

请参阅this post for the difference between the two