I posted the script below on IRC the other week[1] in reply to someone
looking for a way to do this for 'meld'. I'm not sure this is the
*fastest* way to do this, but I'm at least trying to take a few
shortcuts ;-)
Since this is now the second request for such a tool, it would be nice
if you could at least shape this as a contrib/ patch (if it fits your
needs, of course).
[1] http://colabti.org/irclogger/irclogger_log/git?date=2009-07-14#l2180
-- 8< --
#!/bin/sh
. "$(git --exec-path)/git-sh-setup"
cd_to_toplevel # for the tar below
pre="${1-HEAD}"
post="$2"
tmp="$(mktemp -d)"
cleanup () {
rm -rf $tmp
}
trap cleanup EXIT
mkdir "$tmp"/a "$tmp"/b
if [ -n "$post" ]; then
git diff --name-only "$pre" "$post" > "$tmp"/filelist
while read name; do
mkdir -p "$tmp"/b/"$(dirname "$name")"
git show "$post":"$name" > "$tmp"/b/"$name"
done < "$tmp"/filelist
else
git diff --name-only "$pre" > "$tmp"/filelist
tar -c -T "$tmp"/filelist | (cd "$tmp"/b && tar -x)
fi
while read name; do
mkdir -p "$tmp"/a/"$(dirname "$name")"
git show "$pre":"$name" > "$tmp"/a/"$name"
done < "$tmp"/filelist
cd "$tmp"
#meld a b
diff -ur a b
--