If the history that you want to preserve contains merges, the simplest way may be to use a graft to temporarily cut off the unwanted history, then filter-branch to create a branch that has that view of history as the permanent one.
cd /path/to/repo
git checkout -b newbranch special
git rev-parse E > .git/info/grafts
git filter-branch
rm .git/info/grafts
This assumes that you don't currently have any grafts. Since grafts are rarely used and it would probably be a good idea to do this in a fresh clone anyway, that shouldn't be a problem.