it-swarm.com.de

Die Eingabeaufforderung aktualisiert den Git-Zweig nicht

Ich habe versucht, den aktuellen Git-Zweig in meine Eingabeaufforderung zu integrieren, aber er verhält sich nicht wie erwartet. Ich benutze Bash auf Ubuntu 16.04 und Git 2.7.4. Wenn ich ein Terminal starte, wird nichts von Git angezeigt. Wenn ich meinen .bashrc aus einem Repository beziehe, wird der Zweig angezeigt, aber nicht mehr aktualisiert. Das habe ich in meinem .bashrc geschrieben:

green="\[\033[01;32m\]"
blue="\[\033[01;34m\]"
no_color="\[\033[00m\]"
purple="\[\033[01;35m\]"

source ~/.git-Prompt.sh
export PS1="$purple\u $green$(__git_ps1 " (%s)") $blue\W $no_color \$ "

Aktualisieren:

Ich habe versucht, den Anweisungen in Git-Prompt zu folgen, aber immer noch das gleiche Ergebnis. Wenn ich jedoch nur den Vorschlag von git-Prompt kopiere: PS1='[\[email protected]\h \W$(__git_ps1 " (%s)")]\$ ', funktioniert das, sieht aber natürlich nicht so aus, wie ich es will. Gibt es einen Syntaxfehler, den ich vermisse? Die Vorlage PS1 funktioniert auch ohne Export, nur PS1=...

3
Pepe

Ok, ich habe die Lösung gefunden. Es ist nicht erforderlich, den Befehl Eingabeaufforderung zu verwenden. Der Fehler tritt aufgrund eines Syntaxfehlers auf.

Wenn ich den Inhalt von PS1 mit "" belege, um meine Variablen für die Farben zu verwenden, wird die Funktion __git_ps1 nur ausgeführt, wenn .bashrc bezogen wurde.

Aber wenn ich den PS1-Inhalt in '' zuordne und es ohne Variablen für die Farbe mache und stattdessen die Codes ausschreibe, funktioniert es wie erwartet. Und beim Lesen von hier scheint es besser zu sein, PS1 nicht in die Umgebung zu exportieren.

Die Lösung sieht also so aus:

PS1='\[\033[01;35m\]\u \[\033[01;32m\]$(__git_ps1 " (%s)") \[\033[01;34m\]\W \[\033[00m\] \$ '

Ich wäre jedoch gespannt, was der Grund dafür ist. Es funktioniert innerhalb von "" in macOS.

4
Pepe

Dies liegt daran, dass .bashrc nur einmal gelesen wird: wenn Sie eine neue interaktive Shell ohne Anmeldung starten (wenn Sie beispielsweise ein neues Terminal öffnen). Daher wird der PS1 beim ersten Öffnen des Terminals festgelegt und nie geändert.

Die richtige Vorgehensweise (vorausgesetzt, Ihre Skripte git-Prompt und __git_ps funktionieren wie erwartet) ist die Verwendung von Prompt_COMMAND. Wie in man bash erklärt:

   Prompt_COMMAND
          If set, the value is executed as a command prior to issuing each
          primary Prompt.

Sie möchten, dass __git_ps1 vor jeder angezeigten Eingabeaufforderung ausgeführt wird (also nach jedem ausgeführten Befehl, zum Beispiel nach einem cd). Daher müssen Sie es in Prompt_COMMAND einfügen. Wenn Ihr __git_ps1 das ist, was ich denke, wird es PS1 für Sie einstellen. Sie müssen es nur jedes Mal ausführen, wenn eine Eingabeaufforderung angezeigt wird. Fügen Sie also diese Zeile zu Ihrem ~/.bashrc hinzu:

Prompt_COMMAND="$purple\u $green$(__git_ps1 "(%s)") $blue\W $no_color \$ "

Schließlich kann ich nicht sicher sein, dass Sie nicht die relevanten Skripte anzeigen, aber ich bezweifle sehr, dass der (%s) dort Sinn macht. Das wird nur die Zeichenfolge %s drucken. Wenn Sie weitere Hilfe benötigen, bearbeiten Sie bitte Ihre Frage und i) geben Sie sowohl __git_ps1 als auch /etc/bash_completion.d/git-Prompt an (oder teilen Sie uns mit, wie Sie sie installiert haben, wenn sie aus einem Ubuntu-Paket stammen) und ii) geben Sie uns Ihre Eingabeaufforderung soll so aussehen.

2
terdon

Bin auf dasselbe Problem gestoßen. Sie können einfach die $(...) zu \$(...)

export PS1="$purple\u $green\$(__git_ps1 " (%s)") $blue\W $no_color \$ "
0
C14L