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

338

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

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

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

git:176: command not found: _of_ProductSearchQuery

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

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

ruipacheco
источник
8
Я предполагаю, что это связано с вашей средой zsh, так как я смог запустить создание ветки в моей оболочке bash без каких-либо побочных эффектов (lubuntu 13.10), но я вижу ошибку, когда переключаюсь на свою полностью ванильную zsh
Jonathan.Brink
27
В будущем цитирую вещи, которые выглядят подозрительно. git branch "SSLOC-201_Implement___str__()_of_ProductSearchQuery"работает просто отлично.
Qix - МОНИКА ПРОИЗОШЛА
11
@Qix Лучше вообще избегать проблемных персонажей.
jub0bs
3
@Jubobs Определенно, хотя я видел, как некоторые компании применяют такие странные названия филиалов, как это.
Qix - МОНИКА ПРОИЗОШЛА
1
@DwightSpencer Ваша ссылка относится только к Bash, но этот вопрос относится к zsh. На самом деле проблема не возникает в Bash.
jub0bs

Ответы:

617

проблема

Кто-нибудь может объяснить, что случилось? [...] Я хотел бы иметь возможность удалить эту ветку, но 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

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

jub0bs
источник
4
Ничто в этой теме не гласит, что паренсы незаконны. Git, похоже, понравилось просто отлично. Switched to a new branch 'abcd-()-foo'
Qix - МОНИКА ПРОИЗОШЛА
1
Выглядит хорошо; определенно не очень хорошая идея использовать их, но они не являются технически недействительными.
Qix - МОНИКА ПРОИЗОШЛА
12
Что произойдет, если кто-то также затеняет unsetсоздание так называемой функции оболочки? (возможно ли это?)
Маттео Умили
2
@codroipo Ха! Неплохо подмечено. Да, это возможно, и, в этом случае, вам, вероятно, лучше перезапустить zsh.
jub0bs
45
Вы могли бы использовать builtin unset. Если builtinи unsetоба были затенены функциями, то unfunction. Если и этого не было unhash -f. Если все четыре из них ушли, а затем перезапустить оболочку.