I've been using Subversion for a while now. Not sure exactly how long, but about a year, I'd guess. Before that it was CVS for a number of years. I have to say, first of all, if you're not using version control, start. It's worth a bajillion times more than the few hours it'll take to set it up. Second, the Subversion guys had their heads on straight.
I just tried externals definitions for the first time this evening, and talk about sweet. Basically, they let you store (via Subversion properties, aka in-repository metadata), references to external projects subversion repositories, and allow you to transparently work with your multi-repository working directory in totally supported fashion.
Perhaps an example would be good. I'm working on a CFUG presentation on JS remoting, and I'm using Neuromancer and Script.aculo.us as part of it. Since both have Subversion repositories, and I have commit access to the Neuromancer repository (and may want to commit bug fixes while I'm working), externals are perfect. I define a simple svn:externals
property on my root directory, and then do an svn update
, and BAM, I have my working directory updated, including fresh checkouts of the Neuromancer and Script.aculo.us code as well. Make some mods, run svn status
, and again, all the mods on all three projects are nicely laid out hierarchially, ignorant of the fact that they're source resides in three totallly separate SVN repositories.
Also, if I were to check out a fresh working copy on some other machine, guess what happens? I also get the two external projects for free, because the external references are part of the SVN metadata, so they're included, and they're versioned. All for free.
Now this might not seem like a particularly useful feature, but perhaps you have intra-project dependancies, and you need your app to rely on a specific version of a module that is also tracked in your same SVN repository. Create a tag for the sub module, and create an external definition for that tag. Then, until someone updates the svn:externals property, everyone will always get that tag of the submodule, regardless of where the submodule's development takes it. Better yet, when you update svn:externals, as soon as you run svn update on your working directory, you'll magically get the new version of the tag.
Magical….