Назва складної гілки Git зламала всі команди Git


338

Я намагався створити гілку masterза допомогою наступної команди,

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

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

git:176: command not found: _of_ProductSearchQuery

з числом після gitзбільшення кожного разу, коли я набираю команду.

Хтось може пояснити, що сталося? І як я повернуся до нормального стану? Я хотів би видалити цю гілку, але як це зробити?


8
Я б здогадувався, що це пов'язано з вашим середовищем zsh, оскільки мені вдалося запустити створення гілки в моїй баш-шкаралупі без поганих побічних ефектів (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" тепер затінює команду добросовісного 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 ___ str __ () _ of_ProductSearchQuery

належать до повідомлень про фіксацію, а не до імен гілок.


4
Ніщо в цій темі не заявляє, що парони є незаконними. Гіт, здавалося, сподобався просто чудово. Switched to a new branch 'abcd-()-foo'
Qix - МОНІКА ПОГЛЯДАЛА

1
Виглядає добре; напевно, не чудова ідея їх використовувати, але технічно вони недійсні.
Qix - МОНІКА ПОМИЛИ

12
Що станеться, якщо хтось також тініє unset, створивши так звану функцію оболонки? (чи можливо це?)
Маттео Умілі

2
@codroipo Ha! Це хороший момент. Так, це можливо, і в такому випадку вам, мабуть, краще перезапустити zsh.
jub0bs

45
Ви можете використовувати builtin unset. Якщо builtinі unsetобидва були затінені функціями, то unfunction. Якщо це пішло теж unhash -f. Якщо всі чотири з них пішли, а потім перезапустити оболонку.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.