Der komplexe Git-Zweigname hat alle Git-Befehle gebrochen

338

Ich habe versucht, einen Zweig mastermit dem folgenden Befehl zu erstellen :

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

als Git plötzlich nicht mehr reagierte. Ich vermute, dass die Unentschlossenen ()irgendwie schuld sind. Wenn ich jetzt versuche, einen Git-Befehl auszuführen, wird der gleiche Fehler angezeigt:

git:176: command not found: _of_ProductSearchQuery

mit der Zahl nach gitErhöhung jedes Mal, wenn ich einen Befehl eingebe.

Kann jemand erklären, was passiert ist? Und wie komme ich wieder zur Normalität? Ich möchte diesen Zweig löschen, aber wie kann ich das tun?

Ruipacheco
quelle
8
Ich würde vermuten, dass dies mit Ihrer zsh-Umgebung zusammenhängt, da ich den Zweig in meiner Bash-Shell ohne negative Nebenwirkungen erstellen konnte (lubuntu 13.10), aber ich sehe den Fehler, wenn ich zu meinem total vanilla zsh wechsle
Jonathan.Brink
27
Zitieren Sie in Zukunft Dinge, die verdächtig aussehen. git branch "SSLOC-201_Implement___str__()_of_ProductSearchQuery"funktioniert gut.
Qix - MONICA wurde
11
@Qix Besser problematische Zeichen vermeiden.
jub0bs
3
@Jubobs Auf jeden Fall, obwohl ich gesehen habe, dass bestimmte Unternehmen seltsame Filialnamen wie diesen durchsetzen.
Qix - MONICA wurde
1
@ DwightSpencer Ihr Link ist spezifisch für Bash, aber diese Frage ist zsh-spezifisch. Das Problem tritt in Bash nicht wirklich auf.
Jub0bs

Antworten:

617

Problem

Kann jemand erklären, was passiert ist? [...] Ich würde gerne diesen Zweig löschen können, aber Git funktioniert bei mir nicht.

Durch Laufen

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

In zsh haben Sie keinen Zweig erstellt . Stattdessen haben Sie versehentlich drei Shell-Funktionen definiert , die als git, branchund bezeichnet werden und SSLOC-201_Implement___str__deren Parameter (falls vorhanden) ignorieren und deren Körper sich befindet _of_ProductSearchQuery. Sie können selbst überprüfen, ob dies tatsächlich der Fall ist, indem Sie den eingebauten Befehl zsh aufrufen functions, der alle vorhandenen Shell-Funktionen auflistet:

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

Obwohl die beiden anderen Shell-Funktionen nicht problematisch sind, überschattet die Shell-Funktion "git" jetzt leider den echten git Befehl!

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

Daher erhalten Sie anschließend den Fehler

command not found: _of_ProductSearchQuery

wenn Sie versuchen , einen Git - Befehl auszuführen, zum Beispiel git log, git statususw. (vorausgesetzt natürlich, dass kein Befehl aufgerufen _of_ProductSearchQueryexistiert).

Randnotiz

[...] Ich erhalte den gleichen Fehler:

git:176: command not found: _of_ProductSearchQuery

(mit der Zahl nach gitErhöhung jedes Mal, wenn ich einen Befehl eingebe)

Diese Zahl entspricht einfach dem Wert HISTCMDeiner Umgebungsvariablen, die gilt

[t] Die aktuelle Verlaufsereignisnummer in einer interaktiven Shell, dh die Ereignisnummer für den Befehl, der $HISTCMDzum Lesen geführt hat.

Weitere Informationen finden Sie im zsh-Handbuch .

Lösung

Und wie komme ich wieder zur Normalität?

Löschen Sie einfach die problematische Shell-Funktion (und die beiden anderen, die Sie versehentlich erstellt haben, während Sie gerade dabei sind):

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

Dann sollte alles in Ordnung sein.

Was ist, wenn auch unsetSchatten ist?!

Gute Frage ! Ich verweise Sie auf Wumpus W. Wumbleys hervorragenden Kommentar unten.


Tipps zur Benennung von Zweigen

Vermeiden Sie spezielle Shell-Zeichen

Ja, wie in den Kommentaren erwähnt, sind Klammern gültige Zeichen in Git-Zweignamen. Sie müssen nur den Namen entsprechend zitieren, z

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

Die Notwendigkeit, solche Namen jedes Mal in Anführungszeichen zu setzen, wenn sie als Befehlszeilenargumente verwendet werden, sollte Sie jedoch davon überzeugen, Klammern in Referenznamen zu vermeiden. Im Allgemeinen sollten Sie (so weit wie möglich) Zeichen vermeiden, die in Muscheln eine besondere Bedeutung haben, um Überraschungen wie diese zu vermeiden.

Verwenden Sie einfache Filialnamen

Sie sollten Ihre Filialnamen trotzdem kurz und bündig halten. Lange Beschreibungen mögen

SSLOC-201_Implement ___ str __ () _ of_ProductSearchQuery

gehören in Commit-Nachrichten, nicht in Filialnamen.

jub0bs
quelle
4
Nichts in diesem Thread besagt, dass Parens illegal sind. Git schien es gut zu gefallen. Switched to a new branch 'abcd-()-foo'
Qix - MONICA wurde
1
Sieht gut aus; definitiv keine gute Idee, sie zu verwenden, aber sie sind technisch nicht ungültig.
Qix - MONICA wurde
12
Was passiert, wenn jemand auch Schatten erzeugt, unsetindem er eine sogenannte Shell-Funktion erstellt? (
Ist
2
@codroipo Ha! Das ist ein guter Punkt. Ja, es ist möglich, und in diesem Fall ist es wahrscheinlich besser, einen Neustart durchzuführen zsh.
jub0bs
45
Sie könnten verwenden builtin unset. Wenn builtinund unsetbeide durch Funktionen beschattet wurden, dann unfunction. Wenn das auch weg ist , unhash -f. Wenn alle vier davon weg sind, dann starten Sie den Shell.