pythonpython-3.xgitgit-mergemeld

Setting meld as git mergetool with Python3


I've tried setting meld as my mergetool to use with git doing:

git config --global merge.tool meld
git config --global mergetool.meld.path c:/Progra~2/meld/bin/meld

As outlined in answers to questions like:

How to set Meld as git mergetool

I used to have this working on my old work machine but now on my new machine where I have Python3 installed instead of 2.7 I am getting the following error whenever I try git mergetool:

C:/Program Files/Git/mingw64/libexec/git-core/mergetools/meld: c:/Progra~2/Meld/bin/meld: C:/msys64/MINGW32/bin/python3.exe: bad interpreter: No such file or directory

Any ideas what extra steps I need to make to get this to work with Python3?

EDIT: I have tried pointing directly to Meld.exe too but that causes the following crash:

enter image description here


Solution

  • The .../bin/meld script is mostly there for reference. You should set

    git config mergetool.meld.path "C:/Program Files (x86)/Meld/Meld.exe"
    

    You don't need to use Progra~2 notation unless you really want to for some reason.

    The only issue that I am having is that it is not properly picking up the installed dependency extensions in C:/Program Files (x86)/Meld/lib. You need to add C:/Program Files (x86)/Meld/lib to your PATH environment variable, either with SET PATH=C:/Program Files (x86)/Meld/lib;%PATH%, or through the "Edit Environment Variables for your account" somewhere in control panel/start menu.

    Alternative Approach

    If you open C:\Program Files (x86)\Meld\bin\meld in a text editor, you will see that it is a shell script that is intended to be run in python3 (called from C:\Program Files\Git\bin\sh.exe most likely).

    The first line of meld reads:

    #!C:/msys64/MINGW32/bin/python3.exe
    

    This issue does not pop up when using Meld.exe because it does not use the script through a python interpreter.

    It is unlikely that the python interpreter is installed at that location on your machine. Instead, you can replace the shebang line to point to an existing interpreter. For example, on my machine, meld starts with:

    #!C:/Users/MadPhysicist/AppData/Local/Continuum/anaconda3/python.exe
    

    This still won't be enough for the script to find the meld package and all the installed GTK, cairo, etc. DLLs, so you have to tweak both the python and system paths. Insert the following before the line import meld # noqua: E402 (line ~78):

    os.environ['PATH'] = os.pathsep.join((melddir, os.path.join(melddir, 'lib'), os.environ['PATH']))
    sys.path[0:0] = [os.path.join(melddir, 'lib/python3.7/site-packages')]
    

    I was not ever able to get the first line to set up Cairo, GTK, etc. correctly for meld. You can, however, skip the first line and just install the packages using conda or pip. You will still need to insert the meld package into sys.path.

    Keep in mind that meld is compiled in 32 bits, as evidenced by the x86 in the install folder. You can only run it with a 32-bit python interpreter if you use the included DLLs, which may require additional installation. You do not need a 32-bit interpreter if your environment contains all the necessary packages already.