Ich weiß, dass ich einen externen Diff-Befehl angeben kann, der für Folgendes verwendet werden soll git diff
:
[diff]
external =
Aber wenn ich dann in der Konsole angemeldet bin (ohne X), schlägt dies fehl, weil mein visueller Diff die Anzeige (offensichtlich) nicht öffnen kann.
Wie kann ich Git anweisen, visuelle Unterschiede nur zu verwenden, wenn ich bei GUI/X angemeldet bin?
Antwort1
Dies lässt sich auf verschiedene einfache Arten erreichen: Um dies „außerhalb“ von Git zu tun, können Sie Ihr Difftool-Programm (zum Starten eines visuellen Diffs möchten Sie wahrscheinlich Difftool statt Diff) auf ein Wrapper-Skript einstellen, das ermittelt, ob Sie sich in einer grafischen Umgebung befinden oder nicht, und das entsprechende Programm startet; oder Sie können „innerhalb“ von Git einige umgebungsspezifische bedingte Include-Anweisungen (includeIf) ausführen.
Antwort2
Sie haben danach gefragt an answer drawing from credible and/or official sources
, deshalb werde ich in dieser Antwort einige offizielle Dokumente zitieren.
Zuerst müssen wir einen Weg finden, um festzustellen, ob wir innerhalb X
einer Sitzung arbeiten. Wir könnten das zum Beispiel tun, indem wir prüfen, ob $DISPLAY
die Variable gesetzt ist. Wie es hier beschrieben wird man X
:
ANZEIGE
Dies ist die einzige obligatorische Umgebungsvariable. Sie muss auf einen X-Server verweisen. Siehe Abschnitt „Anzeigenamen“ oben.
Allerdings ist das vielleicht keine gute Idee, da jemand
DISPLAY
auch außerhalb von einfach einen falschen Wert festlegen könnte X
. Ein besserer Weg wird in vorgeschlagendiese Antwort:
if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi
Auf Ihrem Computer sollte bereits ein Programm mit dem Namen xhost
installiert sein. Stellen Sie sicher, dass dies der Fall ist:
$ type -a xhost
xhost is /usr/bin/xhost
Nun könnten wir einfach diff.external
auf einen Wrapper verweisen, der einen externen Diff aufruft, wenn wir drinnen sind, X
und den Standardmechanismus ausführt,
git diff
wenn wir nicht drinnen sind X
. Leider fällt mir keine einfache Möglichkeit ein, einen Standard git diff
in auszuführen, diff.external
also erstellen wir stattdessen einen Alias dafür , der vorübergehend mit git
gesetzt wird . Wie in beschrieben :diff.external
-c
man git
-c <Name>=<Wert>
Übergeben Sie dem Befehl einen Konfigurationsparameter. Der angegebene Wert überschreibt Werte aus Konfigurationsdateien. Er wird im gleichen Format erwartet, wie es von git config aufgelistet wird (Unterschlüssel durch Punkte getrennt).
Beachten Sie, dass das Weglassen des = in git -c foo.bar ... zulässig ist und foo.bar auf den booleschen Wert true setzt (genau wie [foo]bar in einer Konfigurationsdatei). Das Einschließen des Gleichheitszeichens, aber mit einem leeren Wert (wie git -c foo.bar= ...), setzt foo.bar auf die leere Zeichenfolge.
Es wäre etwa so:
$ git -c diff.external=diff-wrapper.sh ...
Um zusammenzufassen:
Erstellen Sie ein Skript mit dem Namen
~/git-wrapper.sh
und ersetzen Sie es<YOUR_DIFF_WRAPPER>
durch Folgendes:#!/usr/bin/env sh if xhost >/dev/null 2>&1 then git -c diff.external=<YOUR_DIFF_WRAPPER> "$@" else git "$@" fi
Setzen Sie ein ausführbares Bit:
$ chmod +x ~/git-wrapper.sh
Legen Sie beispielsweise einen Alias in Ihrer Shell-Startdatei fest
~/.bashrc
und laden Sie die Shell neu:alias git=~/git-wrapper.sh
Normalerweise verwenden
git
:$ git diff
Es wird verwendet
<YOUR_DIFF_WRAPPER>
, wenn Sie sich innerhalb befinden, und außerhalb vonX
wird die Standardeinstellung verwendet .git-diff
X