#!/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