For the last year or so, I’ve used CVS to keep my home directory under some sort of version control. However, once it became obvious that CVS was perhaps not the best package for my needs I started looking around for something better. It did not take long for Subversion to appear on my short-list and, ultimately, be selected to replace CVS.

Why was I switching from CVS? Primarily because everything about it felt either woefully inadequate or clumsy or both. - If I felt like renaming a file, it was time to head into the respository itself to do the dirty deed.

  • If I wanted to add a directory and everything in it with just one command, CVS had no way to accomodate me.
  • The branching and tagging were something that I never bothered to figure out.
  • Deleting files always seemed like a clumsy process.
  • etc., etc., etc. Subversion makes performing many of these tasks much easier. For instance, I can move a directory or file by issuing the command: svn move FILENAME NEW_FILENAME No mucking around in the repository required.

Of course, due to the structure of the Subversion repository mucking around in the same is execessively difficult. Whereas CVS kept a directory tree that mirrored that of the source files, Subversion keeps everything in a set of Berkeley DB version 4 files. So, if something goes wrong in the database, you had better hope that svnadmin recover REPOSITORY_PATH can recover it or your bacon is cooked.

Using the cvs2svn tool, I was able to put all of my CVS history and repository relatively easily into a brand spankin’ new Subversion repository.

Some notes and information if you find yourself contemplating a move from CVS to Subversion:1. Do Not under any circumstances delete your old CVS repository until a long while (a month, at least) after you’ve been using Subversion. cvs2svn has some funky options, and if you don’t use them correctly, it will helpfully corrupt some of your binary files. If something does go wrong, you’ll want that repository so that you can restore your working tree.

  1. Try the cvs2svn conversion a few times before going live with a Subversion repository. You’ll want to make sure that your conversion command line is doing what you expect it to do and nothing else.
  2. The command line I used to successfully convert my CVS repository to a Subversion repository (after some experimentation was):cvs2svn -v -s SVN_REPOSITORY_PATH –existing-svnrepos –trunk-only –no-default-eol –mime-types=PATH_TO_APACHE2_MIME.

TYPES_FILE CVS_REPOSITORY_PATHIf you are not using Apache2 to serve up for svn repository, you do not need to worry about assigning MIME types. What will seemingly hose your binary files is EOL translation. Use the option I used above unless you know what you are doing.

  1. Your fingers may be in the habit of typing cvs to access the repository. If you are using bash you may want to add the following line to your ~/.bashrc file:alias cvs=’svn’
  2. Keywords in files placed under Subversion control are not expanded by default. Hence, you may with to add the following to your ~/.subversion/config file:[miscellany]enable-auto-props = yesglobal-ignores = .o .~ ~ *.log *.core[auto-props].pl = svn:keywords=Id;svn:eol-style=native;mime-type=text/ = svn:keywords=Id;svn:eol-style=native;mime-type=text/plain.txt = svn:keywords=Id;svn:eol-style=native;mime-type=text/plain.plx = svn:keywords=Id;svn:eol-style=native;mime-type=text/plain.html = svn:keywords=Id;svn:eol-style=native;mime-type=text/html.css = svn:keywords=Id;svn:eol-style=native;mime-type=text/ = svn:keywords=Id;svn:eol-style=native;mime-type=text/plain.cgi = svn:keywords=Id;svn:eol-style=native;mime-type=text/plain.xml = svn:keywords=Id;svn:eol-style=native;mime-type=text/plain.bat = svn:mime-type=text/plain;svn:eol-style=native.bmp = svn:mime-type=image/bmp.c = svn:mime-type=text/plain;svn:eol-style=native.css = svn:mime-type=text/css;svn:eol-style=native.cpp = svn:mime-type=text/plain;svn:eol-style=native.cxx = svn:mime-type=text/plain;svn:eol-style=native.gif = svn:mime-type=image/gif.h = svn:mime-type=text/plain;svn:eol-style=native.htm = svn:mime-type=text/html;svn:eol-style=native.html = svn:mime-type=text/html;svn:eol-style=native.ico = svn:mime-type=image/ = svn:mime-type=text/plain;svn:eol-style=native.jpeg = svn:mime-type=image/jpeg.jpg = svn:mime-type=image/jpeg.m4 = svn:mime-type=text/plain;svn:eol-style=native.pdf = svn:mime-type=application/pdf.png = svn:mime-type=image/ = svn:mime-type=text/plain;svn:eol-style=native;svn:executable.rc = svn:mime-type=text/plain;svn:eol-style=native.sgm = svn:mime-type=text/sgml;svn:eol-style=native.sgml = svn:mime-type=text/sgml;svn:eol-style=native.spec = svn:mime-type=text/plain;svn:eol-style=native.sql = svn:mime-type=text/plain;svn:eol-style=native.tif = svn:mime-type=image/tiff.tiff = svn:mime-type=image/tiff.text = svn:mime-type=text/plain;svn:eol-style=native.xhtml = svn:eol-style=native.sxw = svn:mime-type=application/vnd.sun.xml.writer.stw = svn:mime-type=application/vnd.sun.xml.writer.template.sxc = svn:mime-type=application/ = svn:mime-type=application/vnd.sun.xml.calc.template.sxd = svn:mime-type=application/vnd.sun.xml.draw.std = svn:mime-type=application/vnd.sun.xml.draw.template.sxi = svn:mime-type=application/vnd.sun.xml.impress.sti = svn:mime-type=application/vnd.sun.xml.impress.template.sxg = svn:mime-type=application/ = svn:mime-type=application/vnd.sun.xml.math.doc = svn:mime-type=application/msword.xls = svn:mime-type=application/ = svn:mime-type=application/ = svn:mime-type=application/ogg.gpg = svn:mime-type=applicaton/pgp.gz = svn:mime-type=application/x-gzip.tgz = svn:mime-type=application/x-gzip.tar = svn:mime-type=application/ = svn:mime-type=application/zip*.mp3 = svn:mime-type=audio/mpeg