Aargh! I’ve been playing with Subversion, and I completely despise it. I have no idea why, given the chance to write a SCM from the ground up, anyone would possibly choose to produce this. It sucks. It sucks hard. In fact, I think it sucks worse than CVS, which it’s intended to replace.
The Case For
- It’s Not CVS(TM). Some people just want anything but CVS.
- Can copy/move/rename files and directories. This is nice. CVS is quite clumsy about moving things around.
- Doesn’t try to expand keywords in binary files, corrupting them. Default CVS behavior is to expand keywords (like $Id$) in all files, which will corrupt binary files in many cases. Subversion doesn’t do anything like that by default.
The Case Against
- Slow. Can you say slow? My god, Subversion is slow. How slow? Slower than a molasses glacier trapped in a stasis-producing rift in the fabric of space-time. Want to commit a file? Get ready to stare at the wall for a good 15 seconds. Heaven help you if you want to create a branch, which can take a good hour on a decent-sized repository. KDE recently switched to Subversion from CVS; I assume that their Subversion admin team consists of giggling homosexuals who take turns branching KDE releases while being whipped as they are repeatedly dunked upside-down into a vat full of piranha-infested human waste with mercury pouring down their throats, with breaks in between sessions to dress their wounds with salt bandages.
- No CVS migration tool. Or rather, no reliable, well-tested tool. I don’t know about you, but I prefer to avoid moving my four years of mission-critical development history to a new SCM system using an unsupported tool created by a third party, which is still in the alpha stages of development.
- It’s on-disk format sucks. It uses Berkeley DB, which is notorious for incompatible changes in it’s on-disk format and library. Say hello to incompatibilities, repository conversion, library conflicts, and crushing migraines. Expect the conversion to take approximately three weeks and completely corrupt your repository.
- It pollutes your project namespace. If you want to use the mind-bogglingly sluggish tag/branch system, you have to have three directories at the top of your project. Fortunately, they aren’t created automatically; you get to do it by hand! Or more likely, not realize that anyone would be retarded enough to think that directories are a good way to manage branches, and therefore not create them at all. Have fun moving everything in your whole repository one level down. It’s easy with Subversion, though by the time the first of the two commands has finished executing, senility may have robbed your memory of the second one.
- To make a new branch, you use the copy command. To make a new tag, you use… the copy command. Now that’s user-centric design!
- Merging is virtually impossible! That’s right, after you’ve gone to the trouble of setting things up so you can tag & branch, you will find that Subversion makes it astonishingly difficult to actually use those branches. The procedure from the FAQ (it’s not mentioned in the manual at all) consists of these seven easy steps:
- Create your branch, ‘foo_branch’
- Create a tag identical to the branch, ‘foo_branch_lastmerge’
- Work on the foo_branch branch
- Merge the difference from the foo_branch_lastmerge tag into your working copy of the foo_branch
- Commit your changes to foo_branch
- Delete the foo_branch_lastmerge tag
- Create a new foo_branch_lastmerge tag from the current foo_branch.
Note, however, that you can’t just specify ‘branches/foo_branch’ – you have to give the full SVN URI every time you reference a tag or branch. It’s enough to send you shrieking back to the caves to chisel code out on stone tablets while making “ook ook” noises.
- Remember, tags and branches are just directories. Isn’t that convenient? And it means that, for a 500mb repository with two branches and two tags to merge changes from those branches, you’re only going to need 2.5gb of space (and bandwidth) to check out the repository. Now that’s convenient.
I hate Subversion.
⚛
Discussion