Hello,
A different approach is to use the
reusable asset service as a versioning repository.
Reusable assets are related to baselines, so each asset corresponds to a package (and you've got the same in-EA comparison tool), but the versions are stored off-project in a "registry" (which is in fact also an EA project, but of a somewhat different nature).
You can only pull the latest version out of a registry, but the service does support dependency management between packages. The support is limited to dependencies within the same "storage" (sub-section within a registry), but it does work. This is the key selling point in my book.
Access to registries and storages is controlled separately from the regular projects, and with a different proprietary mechanism which you'd have to get to know.
You could implement branching by setting up different storages for the different branches; however all management of the branching stuff you'd have to do by imposing suitable policies. (Note: I haven't tested this, so it might be that you'd have to set up separate registries in order to support branching, not just separate storages.)
It's rough and ready in parts, but it has some potential and it might suit your needs.
I've set this up for a client, and we're currently looking at some additional functionality such as between-storage dependency management, which could be implemented but which requires a bit of reverse-engineering of the storage format (which is undocumented, and there's no API).
HTH,
/Uffe