git: visuelle Unterschiede (Meld) nur in der GUI verwenden

git: visuelle Unterschiede (Meld) nur in der GUI verwenden

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 DISPLAYauch 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 xhostinstalliert sein. Stellen Sie sicher, dass dies der Fall ist:

$ type -a xhost
xhost is /usr/bin/xhost

Nun könnten wir einfach diff.externalauf einen Wrapper verweisen, der einen externen Diff aufruft, wenn wir drinnen sind, Xund den Standardmechanismus ausführt, git diffwenn wir nicht drinnen sind X. Leider fällt mir keine einfache Möglichkeit ein, einen Standard git diffin auszuführen, diff.externalalso erstellen wir stattdessen einen Alias ​​dafür , der vorübergehend mit gitgesetzt wird . Wie in beschrieben :diff.external-cman 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.shund 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 ~/.bashrcund 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 von Xwird die Standardeinstellung verwendet .git-diffX

verwandte Informationen