On machine A, git mergetool
runs Beyond Compare 3 as expected. On machine B, BC3 starts but isn't passed any arguments on the command line, thus showing the intro screen instead of the actual merge.
I copied the config from machine A to machine B, and git config --list
is identical apart from the installation path and push.default=simple
:
merge.tool=bc3
mergetool.bc3='C:/Apps/BeyondCompare3/BCompare.exe'
mergetool.bc3.cmd='C:/Apps/BeyondCompare3/BCompare.exe'
mergetool.bc3.path=C:\Apps\BeyondCompare3\bcomp.exe
push.default=simple
The only other differences are that machine A has git 1.7.11 under Win7 64-bit, while machine B (the one that doesn't work) has git 1.8.4 under Win8 32-bit.
ProcessHacker shows that the command line on machine A (for the exact same repository, bit for bit) is:
"c:\Program Files (x86)\Beyond Compare 3\bcomp.exe"
./somefile.cs.LOCAL.4192.cs
./somefile.cs.REMOTE.4192.cs
./somefile.cs.BASE.4192.cs
-mergeoutput=somefile.cs /BCompWnd=$00140644
while on the broken machine B it's simply:
c:\Apps\BeyondCompare3\BCompare.exe
Which magic incantation do I need here?
Just a guess: if Git already (in its factory configuration) knows about bc3 tool, it will use
mergetool.bc3.path
along with standard arguments. If not, it looks formergetool.bc3.cmd
, but this one needs to have the correct arguments indicated in the command:For an obscure reason, on machine B Git doesn't know invocation of
bc3
, and falls back usingmergetool.bc3.cmd
which in your case misses the correct arguments. On machine A, Git knows how to talk to BC3, and will use the correct invocation of the tool, using onlymergetool.bc3.path
.To validate this delete respectively
mergetool.bc3.cmd
andmergetool.bc3.path
on machine A and B, the behaviours should be exactly the same as you observe.To fix it, use the complete invocation on
mergetool.bc3.cmd
.