Meld: ein grafischer Diff-Viewer für Linux

Side-by-Side-Diff mit dem Linux-Diffviewer Meld.

Da sich bei werkraum in letzter Zeit eine entwicklungsbedingte Verschiebung von Windows in Richtung Linux manifestiert (beim Einen mehr, beim Anderen weniger), kommt auch immer wieder die Frage nach Alternativen für Software auf, die wir unter Windows genutzt haben.
Ein Beispiel ist "Beyond Compare 3", ein toller Diff-Viewer für Windows, welcher sowohl für Ordner-Diffs als auch für verschiedene Versionsstände in unseren Git-Repositories genutzt werden konnte.

Die Linux-Variante von Meld

Meld ist ein schöner, grafischer Diff-Viewer für Linux, dessen Bedienung und Benutzeroberfläche stark an Beyond Compare 3 für Windows erinnern.
Standardmäßig können mit Meld bis zu drei Ordner gegeneinander verglichen werden; mit etwas Konfiguration an den Git-Einstellungen sowie einem kleinen Shellscript lässt sich Meld aber recht einfach als externen Diff-Viewer für Git einrichten.
Die letzte Zeile teilt Git mit, dass es meld als externen Diff-Viewer verwenden soll. Wenn wir nun aber in ein Git-versioniertes Verzeichnis wechseln und z.B. ein "git diff Dateiname.php" ausführen, erhalten wir eine Fehlermeldung.
Der Grund dafür liegt darin, dass die meld-Binary null bis vier Parameter beim Aufruf akzeptiert; "git diff" hingegen übergibt sieben Parameter an meld. Das können wir mit einem kleinen Shellscript korrigieren, welches definiert, welche der sieben Argumente meld beim Aufruf von "git diff" annehmen soll; danach wird "diff.external" so geändert, dass unser Shellscript statt der meld-Binary aufgerufen wird. Das Shellscript wiederum ruft Meld mit den angepassten Parametern auf.
Dafür erstellen wir eine kleine .sh-Datei; ich habe mir für derlei Zwecke im Homeverzeichnis ein allgemeines scripts-Verzeichnis angelegt, in welchem die Scripts nach Sprache und Verwendung in Unterordnern weiter kategorisiert werden.
Vorhin haben wir diff.external global für Git auf "meld" gesetzt. Dies überschreiben wir jetzt, sodass statt meld nun unser neues Shellscript aufgerufen wird. Dieses wiederum ruft meld mit dem zweiten und fünften Parameter von git diff auf:
Wenn wir in einem versionierten Verzeichnis jetzt "git diff" aufrufen, wird Meld richtig gestartet.
Anmerkung: wenn es Unterschiede in mehreren Dateien gibt, stellt Meld (wie Beyond Compare übrigens auch) diese im Gegensatz zum "manuellen" Foldercompare nicht in einer Instanz als Tabs dar, sondern immer nur eine Instanz mit einer geöffneten Datei als Side-by-Side-Diff.
Um zur nächsten Datei zu gelangen, muss die aktuelle Instanz einfach geschlossen werden. Danach öffnet sich Meld erneut und zeigt die nächste Datei an.

Meld: Installation und Konfiguration als externen Diff-Viewer für Git

$ sudo apt-get install meld
$ git config --global diff.external meld

../scripts/bash/git.diff.configmeld.sh

#!/bin/bash

# @author       thomas.fricke@werkraum.net
# @date         2013-06-07
# @desc         bash script which makes meld usable as git's external diff viewer.
#               the 'git diff' command sends more params (seven) than meld needs 
#               (up to four), so we'll fix this by making meld accept the 2nd and
#               and 5th argument, only:

meld ${2} ${5}
# make file executable
$ sudo chmod u+x /home/thomasfricke/scripts/bash/git.diff.configmeld.sh
$ git config --global diff.external /home/thomasfricke/scripts/bash/git.diff.configmeld.sh

Hat Dir der Artikel gefallen?