The most important part is the plugins that you are working on, I suppose. What we do is to put the source for all the plugins that are subject to development into revision control, then import the projects into a fresh Eclipse workspace without copying them. This is probably obvious.
A little trickier is the plugins that are part of the runtime environment. We have a special project (also under revision control) that contains those jars, organized in directories. Some are from Eclipse, some are from Spring, logging stuff etc. There also is a target definition file, that defines which of these plugins make up the environment. So you are not compiling and running against the Eclipse copy that you are developing in, but an independent set of plugins that is defined as the target platform.
Understanding and using a target platform makes a big difference, as it doesn't matter anymore what exact version of the IDE you are using - all developers will link against and test the same code. A nice side-effect is that you control the subset of plugins that are part of your product, and it is impossible to accidentally pull in 17 new plugins through an innocent new dependency.
PDE/Build unfortunately doesn't know about target definitions, but the file format is easy enough to figure out.
Finally, preferences and formatting etc can be exported to a file and stuck in revision control, if it matters. Standard formatting rules are useful, I guess.