git difftool and proper path escaping on windows
I'm trying to have git difftool run winmerge to compare files, but it seems to be doing something silly with path translation. My first attempt was:
git difftool -x /c/Program\ Files\ \(x86\)/WinMerge/WinMergeU.exe
To which it responded:
C:\Users\psusi\AppData\Local\Programs\Git/libexec/git-core\git-difftool--helper:
eval: line 61: syntax error near unexpected token `('
C:\Users\psusi\AppData\Local\Programs\Git/libexec/git-core\git-difftool--helper:
eval: line 61: `c:/Program Files (x86)/WinMerge/WinMergeU.exe "$LOCAL"
"$REMOTE
My first thought was that my shell removed the backslash escapes and then git tried to pass the remaining command to another shell. So I wrapped the path in single quotes, which should pass the escapes to git, which should pass them to the shell, which should then be able to parse the spaces in parenthesis in the path, but instead I got this:
Launch 'c:/Program/ Files/ /(x86/)/WinMerge/WinMergeU.exe'
So it appears that git is replacing backslashes with forward slashes, then trying to pass that to the shell, which doesn't work. Any idea how to fix or workaround this bug?
Quoted 22 lines · Phil Susi
I'm trying to have git difftool run winmerge to compare files, but it seems to be doing something silly with path translation. My first attempt was:
git difftool -x /c/Program\ Files\ \(x86\)/WinMerge/WinMergeU.exe
To which it responded:
C:\Users\psusi\AppData\Local\Programs\Git/libexec/git-core\git-difftool--helper:
eval: line 61: syntax error near unexpected token `('C:\Users\psusi\AppData\Local\Programs\Git/libexec/git-core\git-difftool--helper:
eval: line 61: `c:/Program Files (x86)/WinMerge/WinMergeU.exe "$LOCAL" "$REMOTEMy first thought was that my shell removed the backslash escapes and then git tried to pass the remaining command to another shell. So I wrapped the path in single quotes, which should pass the escapes to git,
which should pass them to the shell, which should then be able to parse
Quoted 8 lines
the spaces in parenthesis in the path, but instead I got this:
Launch 'c:/Program/ Files/ /(x86/)/WinMerge/WinMergeU.exe'
So it appears that git is replacing backslashes with forward slashes, then trying to pass that to the shell, which doesn't work. Any idea how
to fix or workaround this bug?
paths and executing external programs on windows is confusing and error-prone for a simple unix user such as myself.
I think you might be able to work around the difficulties by making the tool available in your $PATH, that way you don't have to play shell quoting / escaping games.
I hope that helps. if you discover a different solution, I'd be happy to document it so that windows users don't have to rediscover how to do it in the future.
let me know how it goes.
cheers
Signature · 1 line
David
From: "David Aguilar" <[email protected]>
Quoted 33 lines · Phil Susi
Quoted 22 lines
I'm trying to have git difftool run winmerge to compare files, but it seems to be doing something silly with path translation. My first attempt was:
git difftool -x /c/Program\ Files\ \(x86\)/WinMerge/WinMergeU.exe
To which it responded:
C:\Users\psusi\AppData\Local\Programs\Git/libexec/git-core\git-difftool--helper:
eval: line 61: syntax error near unexpected token `('C:\Users\psusi\AppData\Local\Programs\Git/libexec/git-core\git-difftool--helper:
eval: line 61: `c:/Program Files (x86)/WinMerge/WinMergeU.exe "$LOCAL" "$REMOTEMy first thought was that my shell removed the backslash escapes and then git tried to pass the remaining command to another shell. So I wrapped the path in single quotes, which should pass the escapes to git,
which should pass them to the shell, which should then be able to parseQuoted 8 lines
the spaces in parenthesis in the path, but instead I got this:
Launch 'c:/Program/ Files/ /(x86/)/WinMerge/WinMergeU.exe'
So it appears that git is replacing backslashes with forward slashes, then trying to pass that to the shell, which doesn't work. Any idea how
to fix or workaround this bug?
Quoted 9 lines
paths and executing external programs on windows is confusing and error-prone for a simple unix user such as myself.
I think you might be able to work around the difficulties by making the tool available in your $PATH, that way you don't have to play shell quoting / escaping games.
I hope that helps. if you discover a different solution, I'd be happy to document it so that windows users don't have to rediscover how to do it in the future.
let me know how it goes.
cheers
A quick web browse found https://gist.github.com/shawndumas/6158524 as one example of a winmerge configuration.
my personal .gitconfig has
[difftool "WinMerge"]
path = C:/Program Files/WinMerge/WinMergeU.exe
cmd = 'C:/Program Files/WinMerge/WinMergeU.exe' /e /x /u $LOCAL $REMOTE [mergetool "WinMerge"]
path = C:/Program Files/WinMerge/WinMergeU.exe
cmd = 'C:/Program Files/WinMerge/WinMergeU.exe' /e /x /u $LOCAL $REMOTE $MERGED trustExitCode = false
(excuse whitespace damage)
though I don't use it much.