I'm using Mercurial and though I do use a Cache Studio source control hook (I'm not using ensemble) I think basically the same solution would work for you.
The key is that it's distributed source control. So all the hook does is, on a save, export the current file to a folder on my hard drive, and check it in to my local repository. When things are working right locally, I push it to the central repository - in other words, I just use distributed source control in a normal way.
It's nice to commit each save since this gives me a way to roll things back if I mess something up, but it isn't really necessary. You could write something that pushes the code out to your local repository when you call it from the Cache command prompt.
With distributed source control the fact that check-in and check-out features aren't supported doesn't matter, you handle those issues by merging when you push to the central repository (or however you decide to structure your repositories).
One warning - for Cache class definitions, they are exported as XML in a format you don't define. It includes a time stamp of when the file was generated, and a last modified date. These fool the source control system into thinking they have changed when they have not. So you will have to parse the XML at least enough to strip those out. I don't know of a flag to prevent them from being generated in the first place.