--- /dev/null
+#!/bin/bash
+
+set -e
+set -o pipefail
+
+tmp=.git/dgit-badcommit-fixup-tmp
+rm -rf $tmp
+mkdir $tmp
+
+LC_MESSAGES=C git fsck --no-dangling 2>&1 | \
+ perl -ne 'print $1 if m/^error in commit d1a977e7f9637372750ac02a58e85c35ddd4ca54:.*invalid format - expected '\''committer' | \
+ >$tmp/bad
+
+case `wc -l <$tmp/bad` in
+ 0)
+ echo >&2 'nothing bad found - is git-fsck doing as we expect?' ;
+ exit 8 ;;
+ 1)
+ read <$tmp/bad bads
+ nots="^$onlybad^0 ^$onlybad^1"
+ ;;
+ *)
+ bads="cat $tmp/bad"
+ ;;
+esac
+
+args="$nots"
+
+for head in `git-show-ref --heads`; do
+ exec <$tmp/bad
+ needed=false
+ for bad in $bads; do
+ if git merge-base --is-ancestor $bad $head; then
+ needed=true
+ break
+ fi
+ done
+ if ! $needed; then continue; fi
+ args+=" $head"
+done
+
+echo $args