Git Mergetool mit Meld unter Windows


92

Unter Linux ist Meld mein bevorzugtes Merge-Tool, und ich hatte keine Probleme, es für die Verwendung mit Git zu verwenden oder zu konfigurieren. In Windows war dies jedoch eine andere Geschichte.

Zuerst habe ich Meld von einem Bundle installiert, das ich hier gefunden habe: https://code.google.com/p/meld-installer/

Dann habe ich meine .gitconfig so konfiguriert, dass Meld als Standard-Mergetool unterstützt wird

[merge]                                                      
    tool = meld                                                                         

[mergetool "meld"]                                           
    path = C:\\Program Files (x86)\\Meld\\meld\\meld.exe
    keepBackup = false                                   
    trustExitCode = false

Wenn ich also einen Konflikt habe, mache ich ein Difftool und Meld öffnet sich tatsächlich. Die Pfade zu den Dateien, die Git schreibt, um sie an das Diff-Tool zu übergeben, sind jedoch falsch. Obwohl Git beispielsweise die Dateien BASE, LOCAL und REMOTE im Repository-Verzeichnis (dem Speicherort, von dem aus ich git mergetool aufgerufen habe) generiert, versucht Meld, jede dieser Dateien im Verzeichnis der ausführbaren Datei zu öffnen.

Anstatt C: \ repo \ roses.txt.LOCAL.2760.txt zu öffnen, versucht Meld, C: \ Programme (x86) \ Meld \ meld \ meld \ roses.txt.LOCAL.2760.txt zu öffnen.

Hat jemand dies schon einmal erlebt oder weiß, wie man Git / Meld so konfiguriert, dass es unter Windows richtig funktioniert?


Ich habe keine Ahnung, ob dies sinnvoll ist, aber ich verwende KDiff3. Der in meiner gitconfig eingerichtete Pfad lautet: path = C: / Programme (x86) /KDiff3/kdiff3.exe und nicht C: \\ usw.
Fumler

1
Könnten Sie das Problem lösen?
Roger

1
Ich habe es nicht geschafft. Eine der Antworten ist wahrscheinlich richtig, aber ich zögere, eine als solche zu markieren, da ich Meld nicht dazu bringen kann, sich richtig zu verhalten: - /
Nelson

@ Nelson Mach dir keine Sorgen, ich kann auch nicht :(
abergmeier

Bitte kommentieren und stimmen Sie für das Upstream-Problem ab, damit sich zukünftige Benutzer nicht einmal darum kümmern müssen.
Franklin Yu

Antworten:


150

Warum verwenden Sie Git Bash nicht für Windows?

Nach der Installation verschmelzen einfach:

git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe" <- path to meld here

Das ist alles!


Diese Lösung hat bei mir funktioniert. Ich habe auch den folgenden Befehl ausgeführt, um mich nicht jedes Mal aufzufordern, wenn das Tool git config --global mergetool.prompt false
Vineel Kovvuri

1
Diese Lösung funktionierte für mich mit Meld 3.16.2 und fügte außerdem git config --global mergetool.keepBackup false hinzu, um diese lästigen Backups zu entfernen.
Jay

2
Aus irgendeinem Grund erschien nach dem Anwenden dieser Lösung alles rot (geändert), und ich musste dies tun:git config --global mergetool.meld.cmd '"C:\Program Files (x86)\Meld\Meld.exe" $BASE $LOCAL $REMOTE -o $MERGED'
ihadanny

7
Mit dieser Lösung bekomme ich Cannot import: GTK+und DLL load failed.
Jürgen

4
@Jürgen Die Antwort darauf ist, dass eine Pfadinkongruenz vorliegt. Wenn Sie libgirepository-1.0-1.dll, das sich in Ihrem lib-Verzeichnis befindet, ein Verzeichnis nach oben kopieren (das ist dasselbe Verzeichnis wie Meld.exe) und starten würden, würden Sie feststellen, dass die Dinge funktionieren,
demongolem

26

Schuess, pass auf den Leerzeichencharakter in Verzeichnissen auf!

[merge]
    tool = meld
[mergetool "meld"]
    prompt = false
    keepBackup = false
    keepTemporaries = false
    path = C:/Program Files (x86)/Meld/Meld.exe
    cmd = \"/C/Program Files (x86)/Meld/Meld.exe\" \"$PWD/$LOCAL\" \"$PWD/$BASE\" \"$PWD/$REMOTE\" \"--output=$PWD/$MERGED\"

1
Die Änderungen scheinen mir die Lösung gebrochen zu haben. Die ursprüngliche Revision funktioniert für mich, also +1. Ich habe festgestellt, dass es ohne die Pfadlinie zu funktionieren scheint.
Vossad01

Das ist für mich gearbeitet , wenn ich verwendet , cmdohne pathund verwendet Backticks anstelle von einfachen Anführungszeichen, Apostrophe statt Schrägstrich-doppelte Anführungszeichen.
sq33G

Mit Win10 1903 und WSL habe ich eine Reihe dieser Konfigurationsansätze ausprobiert und Git konnte keine Meldung aufrufen. Am Ende habe ich Symlinking Program_Files_x86 -> 'Program Files (x86)/'und verwendet[mergetool "meld"] path = /mnt/c/Program_Files_x86/Meld/Meld.exe
Bill Hoag

10

Ich hatte genau das gleiche Problem und stellte fest, dass ich mich brutal anstrengen musste, um es zum Laufen zu bringen. Folgendes habe ich in meine .gitconfig-Datei eingefügt. (Beachten Sie, dass sich meine ausführbare Meldungsdatei an einem anderen Ort befindet.)

[merge]
    tool = meld
[mergetool "meld"]
        cmd = "/c/Meld/meld/meld.exe $PWD/$LOCAL $PWD/$BASE $PWD/$REMOTE --output=$PWD/$MERGED"

Genau das hat bei mir gut funktioniert, mit dem benutzerdefinierten Installationspfad, den ich sowieso ausgewählt hatte. Es ist erwähnenswert, dass es einen Unterschied zwischen "Pfad", den die meisten Hilfslinien verwenden, und "cmd" gibt, der hier angegeben wird.
FauxFaux

Ich habe sowohl Ihre als auch Martins Lösungen ausprobiert und beide haben nicht funktioniert. Ich denke, da ist noch etwas los. Ein Fenster wird sofort geöffnet und geschlossen, und Meld wird mit den Pfaden geöffnet, die auf das Installationsverzeichnis von Meld anstatt auf das Repo verweisen. Könnte ein an Meld übergebenes Argument dazu führen, dass es stirbt und dann das Problem erkennt und mit dem Standardpfad neu gestartet wird? Ich begreife hier, aber ich bin nicht sicher, wie ich das beheben soll ...
Nelson

Sie sind sicher, dass Sie die meld.exe verwenden und nicht die meld-Datei, die sich (glaube ich) in einem bin-Ordner befindet. Ich erinnere mich an ein Problem, bei dem ich einfach die Meld-Datei verwendet habe und die Anwendung gestartet wurde, bevor git die Möglichkeit hat, die Dateien in den temporären Ordner zu legen.
schuess

Ich habe Ihre Lösung verwendet, aber die meldDatei im binVerzeichnis verwendet (ich habe die Datei tatsächlich umbenannt meld.py) und es hat ohne Probleme funktioniert.
Jarrett

7

Windows:

Sie können diese beiden Befehle verwenden ( wie Arugin sagt ) - unter Verwendung des richtigen Pfads zu Meld.exe:

git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"

ODER Sie können Ihre C:\Users\YOUR_USER_NAME\.gitconfigDatei einfach direkt bearbeiten und am Ende Folgendes hinzufügen:

[merge]
  tool = meld
[mergetool "meld"]
  path = C:\\Program Files (x86)\\Meld\\Meld.exe

Rufen Sie jetzt git difftoolGit Bash für Windows auf und Meld wird als Standard-Difftool-Viewer geöffnet.


Linux:

UPDATE 20. September 2019:
- Ich könnte die Linux-Version auch hier als Referenz an einer Stelle platzieren, wenn sonst nichts:

Für Linux ist es auch super einfach:

sudo apt update
sudo apt install meld
gedit ~/.gitconfig  # edit your ~/.gitconfig file (gedit GUI editor will open)

Fügen Sie dann am Ende der .gitconfig-Datei Folgendes hinzu:

[diff]
    tool = meld

Das ist es! git difftoolfunktioniert jetzt unter Linux Ubuntu!

Verbunden:

  1. Laden Sie meld von hier herunter und installieren Sie es: https://meldmerge.org/
  2. Wie kann ich Git dazu bringen, den Editor meiner Wahl für Commits zu verwenden?
  3. https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles

4

Ich habe eine Lösung in einem Fehlerbericht im Meld-Installationsprogramm auf dieser Seite gefunden:

https://code.google.com/p/meld-installer/issues/detail?id=11

Soweit ich weiß, besteht das Problem darin, dass das Programm meld.exe (das meld über den Python-Interpreter ausführt) das Arbeitsverzeichnis des Befehls unnötigerweise auf das von meld.exe setzt. Dies führt dazu, dass relative Pfade falsch interpretiert werden, wenn sie als Befehlszeilenargumente übergeben werden.

Die Lösung besteht darin, die bereitgestellte meld.exe durch eine zu ersetzen, die durch Kompilieren der Datei meld.ahk mit AHK2EXe (AutoHotKey-Skript -> exe) generiert wurde. Laden Sie einfach das Skript herunter, das am weitesten unten auf der Seite liegt, da dort einige Versionen veröffentlicht wurden.


3
Der Issue-Tracker war nicht so eingerichtet, dass er mir das Problem automatisch zuweist. Daher habe ich übersehen, dass es Kommentare gab. Für Googler, die dies später finden; Dieses Problem wurde behoben.
Keegan

4

Auch ich hatte ein ähnliches Problem. Das verwendete Betriebssystem ist Windows 10, und die folgenden Änderungen haben bei mir funktioniert. Es scheint eher ein Pfadproblem zu sein

git config --global mergetool.meld.path "/c/Program Files (x86)/Meld/Meld.exe" <- path to meld here

3

Aus irgendeinem Grund konnte in Windows 10 die Umgebungsvariable PATH während der Installation nicht richtig festgelegt werden. Daher wird eine seltsame Ausnahme ausgelöst, die besagt, dass einige DLLs unter "C: \ Programme (x86) /" nicht gefunden werden können. Meld / bin "-Verzeichnis.

Eine Problemumgehung für mich war, in Git Bash ausführen:

export PATH=$PATH:"/C/Program Files (x86)/Meld/lib" 

Oder zu Windows PATH hinzufügen

C:\Program Files (x86)/Meld/bin

2

Keine der Antworten hat bei mir funktioniert. Ich habe dies in der .gitconfig-Datei gefunden:

[merge]
  tool = meld
[mergetool "meld"]
  cmd = 'C:/Program Files (x86)/Meld/Meld.exe' $LOCAL $BASE $REMOTE --output=$MERGED
[mergetool]
  prompt = false

Nach einem git merge mybranchEnde mit Konflikten geben Sie einfach ein git mergetoolund verschmelzen öffnet. Nach dem Speichern müssen Sie in git festschreiben und die Konflikte werden gelöst.

Aus irgendeinem Grund funktionierte dies nur mit Meld 3.18.x, Meld 3.20.x gibt mir einen Fehler.


0

Nachdem ich alle oben genannten Schritte ausprobiert hatte, funktionierte es für mich, Meld als Administrator auszuführen.

  1. Klicken Sie mit der rechten Maustaste auf Meld.exe
  2. Gehen Sie zu Eigenschaften > Kompatibilität und aktivieren Sie das Run this program as an administratorKontrollkästchen

Die Fehler, die ich erhalten habe, referenzierten temporäre Dateien wie c:\windows\temp\meld-*, die nicht erstellt wurden. Das Erhöhen der Meld-Berechtigungen scheint den Trick zu tun, da es jetzt mit beiden funktioniert git difftoolund manuell in Meld ausgeführt wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.