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