#!/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 >$tmp/gfo 2>&1 || test $? = 1 perl -ne ' print $1, "\n" or die $! if m/^error in commit (\w+):.*invalid format - expected '\''committer/; ' <$tmp/gfo >$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="^$bads^0 ^$bads^1" ;; *) bads="cat $tmp/bad" ;; esac args="$nots" refs=`git-for-each-ref --format='%(refname)'` if git-symbolic-ref HEAD >/dev/null 2>&1; then refs+=' HEAD' fi for head in $refs; 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 git filter-branch --original dgit-badcommit --commit-filter ' echo >&2 "FOO $*" cat >&2 echo >&2 ==== false sed -e '\''1,/^$/ s/^commiter /committer /'\'' ' $args