Сложное Git имя ветки сломало все команды Git

Я пытался создать ветку из master с помощью следующей команды:

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

когда Git неожиданно перестает отвечать. Я подозреваю, что unescaped () должен был что-то сделать. Теперь, когда я пытаюсь запустить любую команду Git, я получаю ту же ошибку:

git:176: command not found: _of_ProductSearchQuery

(число после git увеличивается каждый раз, когда я набираю команду)

Кто-нибудь может объяснить, что произошло? И как мне вернуться к нормальной жизни? Мне бы хотелось удалить эту ветку, но Git не будет работать для меня.

Ответ 1

Проблема

Кто-нибудь может объяснить, что произошло? [...] Я хотел бы удалить эту ветку, но Git не будет работать для меня.

Запустив

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

в zsh, вы не создали ни одной ветки. Вместо этого вы случайно определили три функции оболочки, называемые git, branch и SSLOC-201_Implement___str__, которые игнорируют их параметры (если они есть) и тело которых _of_ProductSearchQuery. Вы можете сами убедиться, что это действительно так, вызвав встроенную команду zsh под названием functions, в которой перечислены все существующие функции оболочки:

$ functions                                                     
SSLOC-201_Implement___str__ () {
    _of_ProductSearchQuery
}
branch () {
    _of_ProductSearchQuery
}
git () {
    _of_ProductSearchQuery
}

К сожалению, хотя две другие функции оболочки не являются проблематичными, функция оболочки, называемая "git", теперь теневая команда bona fide 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

(число после git увеличивается каждый раз, когда я набираю команду)

Это число просто соответствует значению HISTCMD, переменной среды, которая содержит

[t] текущий номер события истории в интерактивной оболочке, другими словами, номер события для команды, которая вызывала чтение $HISTCMD.

Подробнее см. руководство zsh.

Решение

И как мне вернуться к нормальной жизни?

Просто удалите проблемную функцию оболочки (и две другие, которые вы создали случайно, пока вы на ней):

unset -f git
unset -f branch SSLOC-201_Implement___str__

Тогда все должно быть хорошо.

Что делать, если unset также затеняется?!

Хороший вопрос! Я отсылаю вас к Wumpus W. Wumbley отличный комментарий ниже.


Советы по наименованию веток

Избегайте любых символов оболочки

Да, как указано в комментариях, круглые скобки являются допустимыми символами в именах ветвей Git; вам просто нужно указать имя соответствующим образом, например.

$ git branch 'foo()bar'
$ git branch
  foo()bar
* master
$ git checkout 'foo()bar'
Switched to branch 'foo()bar'

Однако необходимость цитирования таких имен каждый раз при использовании в качестве аргументов командной строки должна убеждать вас избегать круглых скобок в именах ссылок. В более общем плане вы должны (насколько это возможно) избегать символов, которые имеют особое значение в оболочках, чтобы предотвратить такие неожиданные сюрпризы.

Использовать простые имена ветвей

В любом случае вы должны держать свои названия ветвей короткими и сладкими. Длинные описания, например

SSLOC-201_Implement ___ ул __() _ of_ProductSearchQuery

принадлежат сообщениям фиксации, а не именам ветвей.