--- /dev/null
+#!/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
+kdiff3 a b