This is solution based on hlovdal and VonC answers which I've ended up using.
~/.git_absolute_path.sh
#!/bin/sh
FILE_PATH="$1"
case "$FILE_PATH"
in
/*)
NEW_PATH="$FILE_PATH"
;;
*)
NEW_PATH=`git rev-parse --show-toplevel`/"$FILE_PATH"
;;
esac
echo "$NEW_PATH"
~/.gitconfig
[difftool "echo"]
cmd = echo `~/.git_absolute_path.sh $LOCAL` `~/.git_absolute_path.sh $REMOTE`
path =
[mergetool "echo"]
cmd = echo `~/.git_absolute_path.sh $LOCAL` `~/.git_absolute_path.sh $REMOTE` `~/.git_absolute_path.sh $BASE` `~/.git_absolute_path.sh $MERGED`
trustExitCode = true
[diff]
tool = echo
the difference here is that we are reusing the single script for each path.