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
Unable to translate current working directory. Using C:\Windows\system32
.p4merge
application is started right after the call but gives the following message: Error: ... point to an invalid file
.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.
Thanks to the Windows 10 version 1903 update, accessing the Linux subsystem from Windows 10 is now possible. It is much more easier.
Just make sure that git config --global --list has these lines. That's all!
diff.tool=p4merge
merge.tool=p4merge
difftool.p4merge.cmd=/mnt/c/Program\ Files/Perforce/p4merge.exe "$(wslpath -aw $LOCAL)" "$(wslpath -aw $REMOTE)"
mergetool.p4merge.cmd=/mnt/c/Program\ Files/Perforce/p4merge.exe "$(wslpath -aw $BASE)" "$(wslpath -aw $LOCAL)" "$(wslpath -aw $REMOTE)" "$(wslpath -aw $MERGED)"
mergetool.p4merge.trustexitcode=false
For Beyond Compare 4
, add these lines to your .gitconfig
file:
[merge]
tool = BeyondCompare4
guitool = BeyondCompare4
[diff]
guitool = beyondcompare4
[difftool "beyondcompare4"]
cmd = /mnt/c/Program\\ Files/Beyond\\ Compare\\ 4/bcomp.exe "$(wslpath -aw $LOCAL)" "$(wslpath -aw $REMOTE)"
[mergetool "BeyondCompare4"]
cmd = /mnt/c/Program\\ Files/Beyond\\ Compare\\ 4/bcomp.exe "$(wslpath -aw $LOCAL)" "$(wslpath -aw $REMOTE)" "$(wslpath -aw $BASE)" "$(wslpath -aw $MERGED)"
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With