Il nome del ramo Git complesso ha rotto tutti i comandi Git


338

Stavo cercando di creare un ramo mastercon il seguente comando,

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

quando Git improvvisamente smise di rispondere. Sospetto che la ()colpa sia per i non fuggiti, in qualche modo. Ora, ogni volta che provo ad eseguire qualsiasi comando Git, ottengo lo stesso errore:

git:176: command not found: _of_ProductSearchQuery

con il numero dopo aver gitaumentato ogni volta che digito un comando.

Qualcuno può spiegare cosa è successo? E come posso tornare alla normalità? Vorrei cancellare quel ramo, ma come posso farlo?


8
Immagino che questo sia legato al tuo ambiente zsh dato che sono stato in grado di eseguire la creazione del ramo nella mia shell bash senza effetti collaterali negativi (lubuntu 13.10), ma vedo l'errore quando passo al mio zsh totalmente vanilla
Jonathan.Brink

27
In futuro, cita cose che sembrano sospette. git branch "SSLOC-201_Implement___str__()_of_ProductSearchQuery"funziona benissimo.
Qix - MONICA È STATA MISTREATA il

11
@Qix Meglio evitare del tutto i personaggi problematici.
jub0bs,

3
@Jubobs Sicuramente, anche se ho visto alcune aziende imporre nomi di filiali strani come questo.
Qix - MONICA È STATA MISTREATA il

1
@DwightSpencer Il tuo link è specifico per Bash, ma questa domanda è specifica per zsh. Il problema in realtà non si verifica in Bash.
jub0bs,

Risposte:


617

Problema

Qualcuno può spiegare cosa è successo? [...] Mi piacerebbe poter eliminare quel ramo, ma Git non funzionerà per me.

Correre

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

in zsh, non hai creato alcun ramo . Invece, hai accidentalmente definito tre funzioni shell , chiamate git, branche SSLOC-201_Implement___str__, che ignorano i loro parametri (se presenti) e il cui corpo è_of_ProductSearchQuery . Puoi verificare tu stesso che questo è effettivamente ciò che è accaduto, invocando il comando incorporato zsh chiamato functions, che elenca tutte le funzioni di shell esistenti:

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

Sfortunatamente, sebbene le altre due funzioni shell non siano problematiche, la funzione shell chiamata "git" ora oscura la buona fede git comando !

$ which git
git () {
    _of_ProductSearchQuery
}
# but the real "git" is a binary file that lives in /usr/local/bin/git (or some similar path)

Pertanto, riceverai successivamente l'errore

command not found: _of_ProductSearchQuery

ogni volta che si tenta di eseguire un comando Git, ad es git log , git statusecc. (presupponendo, naturalmente, che non _of_ProductSearchQueryesiste alcun comando chiamato ).

Nota a margine

[...] Ho fatto lo stesso errore:

git:176: command not found: _of_ProductSearchQuery

(con il numero dopo essere gitaumentato ogni volta che digito un comando)

Quel numero corrisponde semplicemente al valore di HISTCMD , una variabile d'ambiente che contiene

[t] il numero di evento della cronologia corrente in una shell interattiva, in altre parole il numero di evento per il comando che ha causato $HISTCMD lettura.

Vedi il manuale di zsh per maggiori dettagli.

Soluzione

E come posso tornare alla normalità?

Elimina semplicemente la problematica funzione shell (e le altre due che hai creato per caso, mentre ci sei):

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

Quindi tutto dovrebbe andare bene.

Cosa succede se unset anche l'ombra fosse ?!

Bella domanda ! Vi rimando all'eccellente commento di Wumpus W. Wumbley di seguito.


Suggerimenti per la denominazione dei rami

Evita i caratteri shell speciali

Sì, come sottolineato nei commenti, le parentesi sono caratteri validi nei nomi dei rami Git; devi solo citare il nome in modo appropriato, ad es

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

Tuttavia, la necessità di citare tali nomi ogni volta che vengono utilizzati come argomenti della riga di comando dovrebbe convincerti a evitare le parentesi nei nomi di riferimento. Più in generale, dovresti (per quanto possibile) evitare personaggi che hanno un significato speciale nelle conchiglie, per evitare sorprese come questa.

Usa nomi di rami semplici

Dovresti comunque mantenere i nomi delle tue filiali brevi e dolci. Descrizioni lunghe come

SSLOC-201_Implement ___ str __ () _ of_ProductSearchQuery

appartengono ai messaggi di commit, non ai nomi delle filiali.


4
Nulla in quel thread afferma che le parentesi siano illegali. A Git sembrava piacere proprio. Switched to a new branch 'abcd-()-foo'
Qix - MONICA È STATA MISTREATA il

1
Sembra buono; sicuramente non è una grande idea usarli, ma non sono tecnicamente non validi.
Qix - MONICA È STATA MISTREATA il

12
Cosa succede se qualcuno unsetcrea anche ombre creando la funzione shell cosiddetta? (è possibile?)
Matteo Umili,

2
@codroipo Ha! È un buon punto. Sì, è possibile e, in tal caso, probabilmente è meglio riavviare zsh.
jub0bs,

45
Puoi usare builtin unset. Se builtine unsetsono stati entrambi oscurati dalle funzioni, allora unfunction. Se questo è andato troppo, unhash -f. Se tutti e quattro sono andati, quindi riavviare la shell.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.