I was wondering if anybody has a more efficient, more intelligent way to do this. The looping construct requires every deleted files to be expunged from every commit by reading each commit. With many commits, this takes a long time.
git log --pretty=format: --name-status | grep -i ^D | cut -f2- | sort -u | xargs -I {} git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch {}' HEAD