#!/bin/sh # Thanks to Thomas Rast # http://thread.gmane.org/gmane.comp.version-control.git/124807 SUBDIRECTORY_OK=1 . "$(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 tool="$(git-config diff.tool)" if [ -n "$tool" ]; then "$tool" a b else diff -urN a b fi