windowsbashgitwindows-subsystem-for-linuxp4merge

How to use difftool and mergetool on Windows 10 Ubuntu bash (WSL)


I use Windows 10 Ubuntu bash, provided by Windows Subsystem for Linux. I want to use a visual diff/merge tool for git. I installed p4merge on Windows (followed this artice) and configured the git .gitconfig file with the following way (I adjusted the paths to be accessible from Windows 10 Ubuntu bash):

[merge]
    tool = p4merge
[mergetool "p4merge"]
    path = /mnt/c/Program Files/Perforce/p4merge.exe
[mergetool]
    prompt = false
[diff]
    tool = p4merge
[difftool "p4merge"]
    path = /mnt/c/Program Files/Perforce/p4merge.exe
[difftool]
    prompt = false

Additionally, I added the following folder to the bash PATH variable in .bashrc to make it callable from anywhere:

 export PATH=$PATH:"/mnt/c/Program Files/Perforce"

So my problem is that if I call git difftool in the bash - to investigate the changes with p4merge - I got the following messages

If I understand right, this problem may emanate from the fact that a Windows program (namely p4merge) could not find a file that is referenced with a Linux file path (e.g. /mnt/c/..).

Is there any way to solve this kind of problem? (Maybe it is a more general problem: using Linux path from Windows application.)

Anyway, I do not insist on using p4merge but any similar visual tool to compare differences and to make merge possible.

Any information you can provide me would be greatly appreciated.


Solution

  • Create file p4mergebash.sh and set $PATH:

    mkdir -p ~/bin
    touch ~/bin/p4mergebash.sh
    chmod +x ~/bin/p4mergebash.sh
    echo 'export PATH=$PATH:/mnt/c/Program\ Files/Perforce' >> ~/.bashrc
    source ~/.bashrc
    

    p4mergebash.sh content:

    #!/bin/sh
    
    LOCAL="$1"
    REMOTE="$2"
    
    case "$LOCAL"
    in
        *)
        L=$(echo "C:/Users/<username>/AppData/Local/lxss/rootfs${LOCAL}" | sed 's,/,\\\\,g')
        ;;
    esac
    
    case "$REMOTE"
    in
        *)
        R=$(echo `git rev-parse --show-toplevel`/"$REMOTE" | sed 's,/mnt/c/,C:/,g' | sed 's,/,\\\\,g')
        ;;
    esac
    
    echo "$L"
    echo "$R"
    p4merge.exe "$L" "$R"
    

    Above script assumes your AppData and your git repo are on C: drive. Insert your username into the angle brackets (i.e. <username>).

    Note: Ensure there are no CRLF's in p4mergebash.sh.

    Then set git config:

    git config --global diff.tool p4mergebash
    git config --global difftool.p4mergebash.cmd '~/bin/p4mergebash.sh $LOCAL $REMOTE'
    git config --global difftool.prompt false