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ć?


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.


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ę.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.