Why I Hate Subversion
I was recently forced into using Subversion again for some .NET work and was instantly reminded of all the reasons I love Git and, not surprisingly, why I hate Subversion with a passion. These reasons need to be shared, because … yea … wow.
Firstly, hidden svn folders, everywhere
This is the number one reason driving my negative opinion of Subversion. Hidden svn folders in every single project folder I have. Really?
me: “All I want to do is drag some folders around in my project. After all, it’s my project, I can do what I want, right?”
Svn: “NOPE, YOU’VE JUST FUCKED YOUR REPO. GOOD LUCK FIXING THIS NIGHTMARE.”
Secondly, no offline capabilities
I work in teams. I have for years. That means that what I write affects other people; other dev people; people I should care about (we’re on the same team, after all).
Because of this, I don’t WANT to push my commit up to the remote repository yet. Seriously, my code isn’t ready and it could confuse other developers when I commit something I’ve half finished.
Argument: “You should never commit broken code.”
My Counter-Argument: “Your code should compile. Sometimes I half-finish some code and then get interrupted by a meeting or an email that takes me on a different track (welcome to the real world of context-switching in agencies).”
Instead of just being able to commit, saying:
This is a progress update, I’m working towards [blah]”
I have to halt everything and get my code into a team-friendly state, so other developers don’t check out my latest commit and bitch out at me because I’ve just broken something.
When you use Subversion, every commit is a one-time risky-as-all-hell operation. You have to constantly ask yourself these questions:
- Did I forget to add a file?
- Did I check in code that doesn’t compile yet?
- If I push my changes up, and then go to lunch for an hour, is what I’ve just committed going to piss anyone off?
In Git, NO PROBLEM. Commit away. Make as many commits as you want, whenever you want. It’s all going to your local Git repository. You only HAVE to push your commits up to the remote repository when you WANT to.
Git is distributed source control because I can be on a space ship a billion miles from Earth and still commit to my local Git repo; just keep chaining those commits up whenever I need. Then when I’m SURE I want my commits to go in the remote repo, THEN I push my commits up for the other developers on my team. but with Svn, no network = no soup for you!
Wait. What’s that? I can already here the argument coming…
Argument: “Why not just create a branch for yourself and commit on that?”
My Counter-Argument: “I would, but branch merging in Svn is so messed up, it gives me no confidence whatsoever. If I branch while work continues on the main head, I’ve got one shit-storm of a merge operation to fix when I want to commit back to the main branch (C-C-C-C-CONFLICT).”
… which, unsurprisingly, leads us to my third point.
Who was on the Subversion team and responsible for merging? It breaks all the time!!! Complaining constantly: Conflict, conflict, conflict, and sometimes: please run cleanup (Really Svn? You aren’t smart enough to run cleanup on your own when you know you need it?).
I’d forgotten how annoying this is, because I rarely ever get merge problems in Git, WRITING THE EXACT SAME .NET CODE! (Yes, I write personal .NET projects in Git and don’t have this problem, so it’s not the language’s fault)
With Svn, I have to manually go in there and fix shit up because Subversion was too retarded to realise that all I did was move a method from one place to another while someone else in my team committed a change in the same file.</rant>
Subversion just conflicts with too many important features of a version control system for me.
Remember: Stupidity is contagious. Avoid Svn at all costs. Use Git.