#!/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" for head in HEAD `git-for-each-ref --format='%(refname)'`; 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 cat >$tmp/flt <<'END' #!/usr/bin/perl -w use strict; undef $/; $_ = ; s/^(\w+.*\n)*commiter /$1committer /; END git filter-branch --original dgit-badcommit --commit-filter ' sed -e '\''1,/^$/ s/^commiter /committer /'\'' ' $args