Wednesday, October 10, 2007


Subversion Introduction:

Subversion is a software source code "Change Management" (CM) system for collaborative development. It maintains a history of file and directory versions. The files and directories are checked out of the repository and into your local project work area. This called your "working directory". Changes are made to files in your "working directory". After changes are made to the create the next working version, the files are checked into the Subversion CM repository.

svn can be known as subversion, it is a version control system after cvs. It claims to be out perform cvs, one of the features of svn is it do support versioning for documents and binaries beside source code.

As you search for subversion, it may lead you to the page of Tortoise is a windows client of svn, you can even create svn repo using tortoise. Tortoise incorporate with windows explorer well, therefore it is easy to use.

When I migrate my svn repository to Linux, I couldn’t find any svn client that as easy as tortoise in windows. I was a bit upset at first. But not more for now, I have learn the way to cope with svn command line. I feel more control on it as in the sense that I know what am I doing by using command line compare to using GUI.

This post is not going to focus on svn installation, as the installation is available anywhere, let me list some links for you in case you are actually looking for installation.

Subversion Installation References

  • Installing Subversion (svn) on Linux (Debian Stable)
  • Setting up Subversion and websvn on Debian
  • How To Configure Web Access To Subversion Repositories Using Apache
  • Install SVN with Web Access on Ubuntu
  • The aim of this tutorial is to guide beginners for using svn command line with simple examples. As I am newbie as well for now, I urge you to notify me if you find some mistake I have made or you have better techniques to share.

    Lets get it started….

    How to get help with svn?
    If you are looking for svn reference in man pages, you have gone to the wrong place. To check the references of svn commands, simple do this:

    svn help

    This will make svn list all the available functions, to get the function reference, let say checkout

    svn help checkout

    The same thing goes to other svn related commands, such as svnadmin

    svnadmin help

    How to create a svn repository?
    First of all what is repository? It is a core file for svn, or you can call it a centralized svn backup database. After created it, it is just a directory with its files. IMPORTANT! Do NOT try to modify or add something into the repository, unless you know what are you doing.

    To create a svn repo, let say I wanna create a repo to store all my programming codes, I do this

    svnadmin create /home/mysurface/repo/programming_repo

    Remember try to use absolute path for everything, sometimes the relative path is not going to work.

    How to import my existing directories into the new repo?

    svn import /home/mysurface/programming file:///home/mysurface/repo/programming_repo -m "Initial import"

    -m stand for log message, the first revision was created with log as “Initial import”. You need to specified URL for the repo, URL is the standard argument for svn. Therefore for local file, you need to specified with file://

    How to see what is inside the repo?

    svn list file:///home/mysurface/repo/programming_repo

    Another way of listing all the files and folder in the tree view, I use svnlook

    svnlook tree programming_repo

    The difference between svn list and svnlook tree is one expect URL another one do not.

    svn command line tutorial for beginners 2 will covers how to checkout, track changes, commit, add or delete files and message logs.

    How to checkout files from svn repo?
    This is the most critical part of svn and also the most common part of svn command line. A lots of open source development projects provided the way for user to check out their latest code through the internet.

    You need to check out in order to commit the changes to svn repo later. Refers back to the previous post, where I import entire directory /home/mysurface/programming to programming_repo. I am going to checkout to the same folder. If you are skeptical of doing this, you may want to backup the directory first.

    mv programming programming-bk 

    Now checkout to programming, mkdir is not needed, as svn will create the directory for you if it is doesn’t exist.

    svn co file:///home/mysurface/repo/programming_repo programming 

    co is the shortform of checkout.

    Okay, lets just compare both folder with diff and store the result into a file comp.diff

    diff programming programming-bk > comp.diff 

    Diff will list the folder in common, and also the differences. Check comp.diff, as it tracks the additional folder .svn that only exist in programming/. Again, do NOT modified or delete this folder.

    Are you convinced to remove your programming-bk/ ? Make sure you keep the repo safe and you can check out the same data anytime, at any place.

    You can even checkout only a specific file or specific folder from your repo. e.g.

    svn co file:///home/mysurface/repo/programming_repo/c/curses/

    This will only check out a file at current directory.

    Single file can’t be checkout like directories, but you can extract them from repository by svn export

    svn export file:///home/mysurface/repo/programming_repo/c/curses/

    How to track the changes before commit to repo?
    First of all, you track what files had changed,

    svn status

    It will list files which have changed, with some attributes besides the filename. Common attributes are M, ?, A … M is modified, A is newly added (how to add refers later section), ? indicate the file is added into local directory but not added into repo.

    Secondly, you want to track the differences between the previous revision and the working one. Lets assume color.c has changed,

    svn diff color.c

    I really don’t like svn diff ’s result. Fortunately, I found a simple bash script what makes vimdiff as the compare tool. The script was written by Erik C. Thauvin, you can get it from here.

    I name it as svndiff and place it at /usr/bin, change the mode to executable.

    chmod +x /usr/bin/svndiff 

    Now, I can simply do this,

    svndiff color.c

    To close the vimdiff, type :qa

    How to commit the changes?
    You can commit with -m to place your log message if it is short. But if it is long, I suggest you to make use of your default editor. I am a vim user, therefore I add a line into my ~/.bashrc


    Now I can commit with this:

    svn ci

    ci is the shortform of commit. Write the log message and close save emacs :x , I am done. The same way as checkout, you can choose to commit one file or any folder.

    How to add or delete file to or from repo?
    The file won’t be committed if you don’t add it into repo. Therefore you need to add it manually if you want it to goes into your repo. Let say you wanna add a new file

    svn add

    Delete does the same way, if you only delete file at your working directory, it won’t reflects the changes to our repo.

    How to check the logs for each revision?
    The simplest way is doing just,

    svn log

    It will list all logs, start from latest revision. That is really irritating! You can limit it to 3 latest revision log by doing this

    svn log --limit 3

    If you wanna check for specific revision, specified with -r,

    svn log -r 3

    I find something awkward, let say I have done svn delete at revision 3 (latest), and revision 2 is the changes of the deleted file at revision 3. When I do svn log, by right it should show all 3 logs, but It only shows for revision 1. It means the svn log will only shows the log if the file is exist, bare in mind.

    How to update the working directory into the latest revision?

    svn update

    Update to specific revision?

    svn update -r 3

    I think thats all for normal use of svn commands, further reading at

    No comments: