git bash: Can't spawn kdiff3 as difftool

4.7k views Asked by At

I'm trying to use KDiff3 as a difftool in Git Bash on a Windows 8.1 system, and I'm admittedly pretty new to Git. I can't get KDiff3 to open when I try comparing a staged file to the committed file, and I'm confused about what to do about it. I found directions online for setting up KDiff3 as a merge tool, and I guessed that I needed to do something similar to set it up as a diff tool (I haven't been able to find sufficiently explicit directions for newbies for setting up the diff tool, which is why I'm here). This is what I did after downloading and installing KDiff3:

 git config --global diff.tool kdiff3
 git config --global difftool.kdiff3.cmd '"C:\\Program Files\\KDiff3\\kdiff3" $BASE $LOCAL $REMOTE -o $MERGED'

Git didn't spew any errors at me, so maybe that's correct? I completely admit that I don't understand the syntax here! Anyway, when I tried this:

 git diff HEAD

I get this:

 error: cannot spawn kdiff3: No such file or directory
 external diff died, stopping at MyFile.R

I've looked around, and I see some references to people having similar problems when their $PATH wasn't set correctly. I don't really know what the $PATH is (and if someone could enlighten me, I'd be much obliged), but the path that I've got for KDiff3 (C:\Program Files\KDiff3\kidff3) is definitely where kdiff3.exe is located on my machine. Any suggestions?

Thanks in advance, and as I said, I'm new to Git, so if I haven't provided some critical piece of information, please let me know.

2

There are 2 answers

2
Robin Hsu On BEST ANSWER

I suggest you give up your second line of configruation, as Git bash has already defined how to use kdiff3. (You can look at your installation of Git Bash. for example, in my path, I can find C:\Program Files (x86)\Git\libexec\git-core\mergetools\kdiff3, which is the configuration file for kdiff3). The only thing you need to do is to put kdiff3 in your PATH variable.

Use only your first line:

git config --global diff.tool kdiff3

but NOT your second line:

#### comment out this line:
# git config --global difftool.kdiff3.cmd '"C:\\Program Files\\KDiff3\\kdiff3" $BASE $LOCAL $REMOTE -o $MERGED'

To fix your already added config, try to edit your .gitconfig, under your GIT BASH

vim ~/.gitconfig

Find the section [difftool "kdiff3"], and remove the line with cmd= under that section. You may remove the whole section as well (i.e. also remove the line containing [difftool "kdiff3"]

Then add your path to kdiff3:

PATH=$PATH:"/c/Program Files/KDiff3"

Double quote is needed because of the space between "Program" and "Files".

This PATH line can be added to your .bashrc or .bash_profile, depending on how you start your bash...

--- UPDATE ---

Correction: Since Git Bash uses Windows system defined environment variable 'PATH' + Windows user defined environment variable 'PATH'. The above PATH change is harder (using .bashrc, etc..). Just change Windows environment variables like this link, and/or this link

0
cx6ds On

Change your second line in GitBash:

git config --global diff.tool kdiff3
git config --global difftool.kdiff3.path 'c:\Program Files\KDiff3\kdiff3.exe'

The corresonding section in the global .gitconfig looks like that:

[diff]
    tool = kdiff3
[difftool "kdiff3"]
    path = c:\\Program Files\\KDiff3\\kdiff3.exe 

And just for avoiding confusion:

Now git difftool HEAD launches kdiff3.

But git diff HEAD still shows the changes in GitBash.