Edit: I packaged this story into a blog post here, it seemed a good excuse for a first blog :)
Here is what I've settled on:
for name in $(git diff --name-only $1); do git difftool $1 $name & done
This gets the list of modified files and calls the external diff tool on each separate file.
The key to it is the & command param which tells the external diff command to run in a background task, thus allowing successive diffs to run immediately. In the case of BeyondCompare this causes all the files to open in tabs within the same BC window, which is what I want.
To make it easy to use, I saved the script to a file called diffall.sh and copied that to /my-git-install-dir/cmd/ folder so that it is in my path, then created a git alias for it called diffall :
git config --global alias.diffall '!sh diffall.sh'
Now I can run it by typing (accepts optional params, eg HEAD or --staged):
git diffall
and fall back on the normal external diff etc:
git difftool
Edit: updated (details at blog) to handle paths with spaces, additional no-prompt setting, and multiple input params.
git diff --name-only "$@" | while read filename; do
git difftool "$@" --no-prompt "$filename" &
done