Git mergetool avec Meld sous Windows

93

Sous Linux, mon outil de fusion préféré est Meld, et je n'ai eu aucun problème à l'utiliser ou à le configurer pour qu'il fonctionne avec Git. Cependant, dans Windows, la situation est différente.

Tout d'abord, j'ai installé Meld à partir d'un bundle que j'ai trouvé ici: https://code.google.com/p/meld-installer/

Ensuite, j'ai configuré mon .gitconfig comme ceci pour prendre en charge Meld comme outil de fusion par défaut

[merge]                                                      
    tool = meld                                                                         

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

Donc, quand j'ai un conflit, je fais git difftool et Meld s'ouvre en fait. Cependant, les chemins d'accès aux fichiers que Git écrit pour passer à l'outil de comparaison sont incorrects. Par exemple, même si Git génère les fichiers BASE, LOCAL et REMOTE dans le répertoire du référentiel (l'emplacement d'où j'ai appelé git mergetool), Meld essaie d'ouvrir chacun de ces fichiers dans le répertoire de l'exécutable.

Au lieu d'ouvrir C: \ repo \ roses.txt.LOCAL.2760.txt, Meld essaie d'ouvrir C: \ Program Files (x86) \ Meld \ meld \ roses.txt.LOCAL.2760.txt.

Quelqu'un a-t-il déjà rencontré ce problème ou sait comment configurer Git / Meld pour qu'il fonctionne correctement sous Windows?

Nelson
la source
Je n'ai aucune idée si cela a un intérêt à être essayé, mais j'utilise KDiff3, et le chemin mis en place dans mon gitconfig est: path = C: / Program Files (x86) /KDiff3/kdiff3.exe et non C: \\ etc.
Fumler
1
Pouvez-vous résoudre le problème?
Roger
1
Je n'ai pas pu. L'une des réponses est probablement correcte, mais j'hésite à en marquer une comme telle car je ne parviens pas à faire en sorte que Meld se comporte correctement: - /
Nelson
@Nelson Ne vous inquiétez pas, je ne peux pas non plus :(
abergmeier
Veuillez commenter et voter pour le problème en amont afin que les futurs utilisateurs n'aient même pas à s'inquiéter à ce sujet.
Franklin Yu

Réponses:

151

Pourquoi n'utilisez-vous pas git bash pour Windows?

Après l'installation, fusionnez simplement:

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

C'est tout!

Arugin
la source
Cette solution a fonctionné pour moi, j'ai également fait la commande ci-dessous pour ne pas m'inviter à chaque fois qu'elle ouvre l'outil git config --global mergetool.prompt false
Vineel Kovvuri
1
Cette solution a fonctionné pour moi avec Meld 3.16.2, a également ajouté git config --global mergetool.keepBackup false pour supprimer ces sauvegardes embêtantes.
Jay le
2
pour une raison quelconque, après avoir appliqué cette solution, tout est apparu en rouge (changé), et j'ai dû le faire:git config --global mergetool.meld.cmd '"C:\Program Files (x86)\Meld\Meld.exe" $BASE $LOCAL $REMOTE -o $MERGED'
ihadanny
7
Avec cette solution, j'obtiens Cannot import: GTK+et DLL load failed.
Juergen
4
@Juergen La réponse à cela est qu'il y a une incohérence de chemin. Si vous copiez libgirepository-1.0-1.dll qui se trouve dans votre répertoire lib un répertoire vers le haut (c'est-à-dire le même répertoire que Meld.exe) et que vous démarrez, vous trouveriez que les choses fonctionnent,
demongolem
26

Schuess, faites attention au caractère espace dans les répertoires!

[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\"
Martin Dušek
la source
1
Les modifications me semblent avoir rompu la solution. La révision originale fonctionne pour moi, donc +1. J'ai trouvé que cela semble fonctionner sans la ligne de chemin.
vossad01
Cela a fonctionné pour moi lorsque j'ai utilisé cmdsans pathet utilisé des contre-indications au lieu de guillemets simples, des guillemets simples au lieu de guillemets doubles.
sq33G
Avec Win10 1903 et WSL, j'ai essayé un tas de ces approches de configuration et git ne pouvait pas invoquer meld. J'ai fini par créer des liens symboliques Program_Files_x86 -> 'Program Files (x86)/'et utilisé[mergetool "meld"] path = /mnt/c/Program_Files_x86/Meld/Meld.exe
Bill Hoag
10

J'ai eu exactement le même problème et j'ai trouvé que je devais forcer ma façon de faire fonctionner. Voici ce que j'ai mis dans mon fichier .gitconfig. (Notez que mon exécutable meld est dans un emplacement différent)

[merge]
    tool = meld
[mergetool "meld"]
        cmd = "/c/Meld/meld/meld.exe $PWD/$LOCAL $PWD/$BASE $PWD/$REMOTE --output=$PWD/$MERGED"
schuess
la source
Exactement cela a bien fonctionné pour moi, avec le chemin d'installation personnalisé que j'avais choisi de toute façon. Il convient de noter qu'il existe une différence entre "chemin", que la plupart des guides utilisent, et "cmd" qui est spécifié ici.
FauxFaux
J'ai essayé la vôtre et les solutions de Martin et aucune n'a fonctionné. Je pense qu'il se passe autre chose. Une fenêtre s'ouvre puis se ferme immédiatement, puis Meld s'ouvre avec les chemins pointant vers le répertoire d'installation de Meld au lieu du dépôt. Un argument transmis à Meld pourrait-il le faire mourir, puis il détecte le problème et redémarre avec le chemin par défaut? Je saisis ici mais je ne sais pas comment résoudre ce problème ...
Nelson
Vous êtes sûr d'utiliser le meld.exe et non le fichier meld qui se trouve (je pense) dans un dossier bin. Je me souviens avoir eu un problème où j'ai utilisé simplement le fichier meld et il lance l'application avant que git ait une chance de mettre les fichiers dans le dossier temporaire.
schuess
J'ai utilisé votre solution, mais en utilisant le meldfichier dans le binrépertoire (j'ai en fait renommé le fichier meld.py) et cela a fonctionné sans problème.
Jarrett
7

Les fenêtres:

Vous pouvez utiliser ces deux commandes ( comme le dit Arugin ) - en utilisant le chemin approprié vers Meld.exe:

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

OU vous pouvez simplement modifier votre C:\Users\YOUR_USER_NAME\.gitconfigfichier directement et ajouter ce qui suit à la fin de celui-ci:

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

Maintenant, appelez git difftoolGit Bash pour Windows et Meld s'ouvrira en tant que visualiseur de difftool par défaut.


Linux:

MISE À JOUR 20 septembre 2019:
- Je pourrais aussi bien mettre la version Linux ici aussi pour ma propre référence en un seul endroit si rien d'autre:

Pour Linux, c'est aussi très simple:

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

Ensuite, ajoutez au bas du fichier .gitconfig:

[diff]
    tool = meld

C'est tout! git difftoolfonctionne maintenant sur Linux Ubuntu!

En relation:

  1. Téléchargez et installez meld à partir d'ici: https://meldmerge.org/
  2. Comment faire en sorte que Git utilise l'éditeur de mon choix pour les commits?
  3. https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
Gabriel Staples
la source
4

J'ai trouvé une solution dans un rapport de bogue sur le programme d'installation de meld, sur cette page:

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

Pour autant que je sache, le problème est que le programme meld.exe (qui exécute meld via l'interpréteur python) définit inutilement le répertoire de travail de la commande sur celui de meld.exe. Cela entraîne une interprétation incorrecte des chemins relatifs lorsqu'ils sont passés en tant qu'arguments de ligne de commande.

La solution est de remplacer le meld.exe fourni par un généré en compilant le fichier meld.ahk, en utilisant AHK2EXe (script AutoHotKey -> exe). Il suffit de télécharger le script le plus bas de la page, car il y a eu quelques versions publiées là-bas.

star99ers
la source
3
Le suivi des problèmes n'a pas été configuré pour m'attribuer automatiquement le problème, j'ai donc manqué qu'il y avait des commentaires. Pour les googleurs qui trouvent cela plus tard; Ce problème a été corrigé.
Keegan
4

J'ai aussi rencontré un problème similaire.Le système d'exploitation utilisé est Windows 10 et les changements suivants ont fonctionné pour moi.Il semble plus comme un problème de chemin

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

Pour une raison quelconque, dans Windows 10, la variable d'environnement PATH n'a pas pu être définie correctement lors de l'installation, donc une exception étrange est levée indiquant qu'il ne peut pas trouver certains .dll qui se trouvent sous "C: \ Program Files (x86) / Répertoire Meld / bin ".

Une solution de contournement pour moi était, exécutez dans git bash:

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

Ou ajouter à Windows PATH

C:\Program Files (x86)/Meld/bin
David L.
la source
2

Aucune des réponses n'a fonctionné pour moi. J'ai fini avec ceci dans le fichier .gitconfig:

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

Après une git merge mybranchfin avec des conflits, il vous suffit de taper git mergetoolet de fusionner s'ouvre. Après une sauvegarde, vous devez vous engager dans git et les conflits sont résolus.

Pour une raison quelconque, cela ne fonctionnait qu'avec Meld 3.18.x, Meld 3.20.x me donne une erreur.

Jeremy Benks
la source
0

Après avoir essayé tout ce qui précède, configurer Meld pour qu'il s'exécute en tant qu'administrateur a fonctionné pour moi.

  1. Cliquez avec le bouton droit sur Meld.exe
  2. Allez dans Propriétés > Compatibilité et cochez la Run this program as an administratorcase

Les erreurs que j'ai reçues c:\windows\temp\meld-*faisaient référence à des fichiers temporaires tels que , qui n'étaient pas créés. L'élévation des autorisations de Meld semble faire l'affaire car elle fonctionne maintenant avec les deux git difftoolet s'exécute manuellement dans Meld.

Drey
la source