2014-10-10 6 views
2

Я использую zsh и prezto с cygwin. Когда я набираю эту команду git 'git reset HEAD5', zsh не находит HEAD ^. Но когда я переключаюсь на использование bash, он работает.zsh не распознает HEAD^

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

Кто-нибудь видел ту же проблему?

ответ

5

^ характера рассматриваются как специальные в имени файла расширениях в Zsh, но только если опция EXTENDED_GLOB установлена:

zsh% setopt noEXTENDED_GLOB 
zsh% echo HEAD^ 
HEAD^ 
zsh% setopt EXTENDED_GLOB 
zsh% echo HEAD^ 
zsh: no matches found: HEAD^ 
zsh% 

Bash не имеет эту функцию. (Чтобы быть точными, Баш имеет расширенную функцию Глоба, включены по shopt -s extglob, но расширенному синтаксису Глобы в Bash не рассматривает характер ^ как специальные.)

Если эту функцию включена, ^ специальный символ похож на * но с другим смыслом. Подобно *, вы можете заблокировать его особый смысл, избегая его, либо заключая его в одинарные, либо в двойные кавычки или предшествуя ему обратным слэшем. Цитирование - это самое простое решение.

Вместо

git reset HEAD^ 

попробовать это:

git reset 'HEAD^' 

Смысл ^ шаблона не имеет значения, так как все, что вам нужно сделать, это не использовать его, но я упомяну его так или иначе. Согласно руководству zsh, ^X соответствует чему-либо кроме образец X. В случае HEAD^ ничего не следует за ^ - это означает, что HEAD^ соответствует HEAD, за которым следует ничего, кроме ничего. Это окольный способ сказать, что HEAD^ соответствует именам файлов, начинающимся с HEAD и сопровождаемым некоторой непустой строкой. С учетом файлов HEAD, HEAD1 и HEAD2, рисунок HEAD^ соответствует HEAD1 и HEAD2.

3

issue 449 oh-my-zsh описывает это точное поведение и обеспечивает решение.

Преступник является опцией extended_glob на zsh. Presto должен установить его. Поэтому, когда вы вводите HEAD^, zsh пытается создать выражение отрицания glob и сбой ошибки.

Иными словами, setopt extended_glob позволяет использовать ^, чтобы свести на нет глобусы.

Чтобы исправить это, вы можете написать эту строку на вашем .zshrc:

unsetopt nomatch 

С выше линии, мы говорим, чтобы ЗШ мы хотим, когда соответствующий шаблон не удается, просто используйте команду «как есть» ,

+0

Не рекомендуется отключать 'nomatch', чтобы избежать этой ошибки. Это будет иметь поступок по поведению для всего другого кода оболочки, который пользователь может не пожелать или ожидать. Вероятно, лучше процитировать строку 'git reset 'HEAD ^" ', вывести символ' git reset HEAD \^'или использовать тильду, если это подходит' git reset HEAD ~ 1' – Zorawar

+0

Я не вижу проблемы с этим потому что скрипты могут использовать '#!/usr/bin/env zsh -f', и я не уверен, что использование' #!/usr/bin/env zsh' заставляет скрипт выбирать конфигурацию из '~/.zshrc'. Если это так, это может быть проблемой. И даже тогда сценарий должен установить его собственные параметры, чтобы быть уверенным. Он не должен зависеть от конкретных конфигураций пользователей. – ninrod

+0

Это правда, но я все равно смущаюсь делать это в своей системе, по крайней мере потому, что он изменяет ожидаемое поведение шаблонов глобусов, которые могут вас поймать, если вы не внимательны. Например, 'var = (*. Fooext)' с 'nomatch' unset не будет вызывать ошибку, если совпадение glob завершится неудачно, вместо этого будет создана строка с именем« * .fooext »в массиве' var'. И это может быть не то, что вы ожидаете. Опять же, это могут быть только случаи краев, и я думаю, что до потребителя решать самим, какая система им нужна ... – Zorawar