Złożona nazwa gałęzi Git złamała wszystkie polecenia Git

338

Próbowałem utworzyć gałąź masterz następującego polecenia,

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

kiedy Git nagle przestał odpowiadać. Podejrzewam, że w ()jakiś sposób winni są nieskrywani . Teraz za każdym razem, gdy próbuję uruchomić dowolne polecenie Git, pojawia się ten sam błąd:

git:176: command not found: _of_ProductSearchQuery

z liczbą gitrosnącą za każdym razem, gdy wpisuję polecenie.

Czy ktoś może wyjaśnić, co się stało? Jak mogę wrócić do normy? Chciałbym usunąć tę gałąź, ale jak mogę to zrobić?

ruipacheco
źródło
8
Domyślam się, że jest to związane z twoim środowiskiem zsh, ponieważ mogłem uruchomić tworzenie gałęzi w mojej powłoce bash bez żadnych niepożądanych efektów ubocznych (lubuntu 13.10), ale widzę błąd, gdy przełączam się na całkowicie waniliowe zsh
Jonathan.Brink
27
W przyszłości przytaczaj rzeczy podejrzane. git branch "SSLOC-201_Implement___str__()_of_ProductSearchQuery"działa dobrze.
Qix - MONICA MISTREATED
11
@Qix Lepiej całkowicie unikać problematycznych postaci.
jub0bs
3
@Jubobs Zdecydowanie, chociaż widziałem, jak niektóre firmy wymuszają takie dziwne nazwy oddziałów.
Qix - MONICA MISTREATED
1
@DwightSpencer Twój link jest specyficzny dla Bash, ale to pytanie dotyczy zsh. Problem tak naprawdę nie występuje w Bash.
jub0bs

Odpowiedzi:

617

Problem

Czy ktoś może wyjaśnić, co się stało? [...] Chciałbym móc usunąć tę gałąź, ale Git nie będzie dla mnie działać.

Biegiem

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

w Zsh nie utworzyłeś żadnej gałęzi . Zamiast tego przypadkowo zdefiniowałeś trzy funkcje powłoki , nazwane git, branchi SSLOC-201_Implement___str__, które ignorują ich parametry (jeśli istnieją) i których treść jest _of_ProductSearchQuery. Możesz sam sprawdzić, czy tak właśnie się stało, wywołując wbudowane polecenie zsh functions, które wyświetla wszystkie istniejące funkcje powłoki:

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

Niestety, chociaż pozostałe dwie funkcje powłoki nie są problematyczne, funkcja powłoki o nazwie „git” teraz cienia polecenia 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)

Dlatego pojawi się błąd

command not found: _of_ProductSearchQuery

gdy spróbujesz uruchomić polecenie git przykład git log, git statusitd (zakładając oczywiście, że ma polecenia o nazwie _of_ProductSearchQueryistnieje).

Dygresja

[...] Otrzymuję ten sam błąd:

git:176: command not found: _of_ProductSearchQuery

(z liczbą gitrosnącą za każdym razem, gdy wpisuję polecenie)

Liczba ta po prostu odpowiada wartości HISTCMDzmiennej środowiskowej, która zawiera

[t] bieżący numer zdarzenia historii w interaktywnej powłoce, innymi słowy numer zdarzenia dla polecenia, które spowodowało $HISTCMDodczytanie.

Więcej informacji znajduje się w instrukcji obsługi Zsh .

Rozwiązanie

Jak mogę wrócić do normy?

Po prostu usuń problematyczną funkcję powłoki (i dwie pozostałe, które utworzyłeś przypadkowo, gdy jesteś przy niej):

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

Wtedy wszystko powinno być w porządku.

Co jeśli unsetjest również śledzony ?!

Dobre pytanie ! Odsyłam do wumpusa W. Wumbley wspaniałe komentarzu poniżej.


Wskazówki dotyczące nazewnictwa gałęzi

Unikaj specjalnych znaków powłoki

Tak, jak wskazano w komentarzach, nawiasy są prawidłowymi znakami w nazwach gałęzi Git; wystarczy odpowiednio podać nazwę, np

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

Jednak potrzeba cytowania takich nazw za każdym razem, gdy są używane jako argumenty wiersza poleceń, powinny przekonać cię do unikania nawiasów w nazwach referencyjnych. Mówiąc bardziej ogólnie, powinieneś (o ile to możliwe) unikać znaków, które mają specjalne znaczenie w muszlach, aby uniknąć takich niespodzianek.

Użyj prostych nazw gałęzi

W każdym razie powinieneś utrzymywać krótkie i słodkie nazwy swoich oddziałów. Długie opisy jak

SSLOC-201_Implement ___ str __ () _ of_ProductSearchQuery

należą do komunikatów zatwierdzania, a nie do nazw gałęzi.

jub0bs
źródło
4
Nic w tym temacie nici nie jest nielegalne. Gitowi chyba się to podobało. Switched to a new branch 'abcd-()-foo'
Qix - MONICA MISTREATED
1
Wygląda dobrze; zdecydowanie nie jest to świetny pomysł na ich użycie, ale nie są technicznie nieprawidłowe.
Qix - MONICA MISTREATED
12
Co się stanie, jeśli ktoś również cienie unset, tworząc funkcję powłoki tak zwaną? (czy to możliwe?)
Matteo Umili
2
@codroipo Ha! Trafne spostrzeżenie. Tak, jest to możliwe, aw takim przypadku prawdopodobnie lepiej zrestartować komputer zsh.
jub0bs
45
Możesz użyć builtin unset. Jeśli builtini unsetoba zostały zasłonięte przez funkcje, to unfunction. Jeśli to już też unhash -f. Jeśli wszystkie cztery z nich zostaną usunięte, a następnie ponownie uruchom powłokę.