I would probably start by pushing all the repositories to separate branches in a central repository, from which I can rebase, merge etc between branches easily.
A good visualization tool such as git-age, gitnub, gitx, giggle can work wonders, but your task will probably be rather tedious unless you can find the branching points. If there are similar patches applied to all branches you can use (interactive) rebase to reorder your commits such that they are in the same order. Then you can start 'zipping up' your branches, moving the branch-point upwards by putting commits into master. A nice description on how to reorder commits using rebase can be found here.
Chances are the actions you need to take are described in the links provided by the Git Howto Index. A good cheat sheet is always nice to have within reach. Also, I suspect the followup to Eric Sinks post "DVCS and DAGs, Part 1" will contain something useful (It didn't, but was an interesting read nontheless).
Additional good-to-have links are: Git Magic, Git Ready and SourceMage Git Guide
I hope all the repos had good commit messages that tell you the purpose of each patch, it's that or code review :)
As for how to maintain customizations we've had luck with the following:
We started by separating (or keeping separate) the customized code from the generic code. Then we've tried two approaches; both which worked fine:
- All deployments got their own repositories where the customization was kept.
- All deployments got their own branch in a 'customization'-repository.
After the first deployment and seeing that the second was a fact we spent some time trying to foresee future customization/cutting points to reduce duplication across the customized repos (alt. 1, which is the approach we currently use) and in the base/core repo.
And yes, we do try to refactor mercilessly whenever we notice the core/customization split slipping :)