UMBC High Performance Computing Facility
Using Subversion for source control
Introduction
Subversion (SVN) is useful tool for collaborating on projects. It's in a
class of tools called Source Control Management (SCM), of which there are many
other packages available too. We will focus on SVN though, because it is open
source and fairly easy to use.
SVN can do things like:
track the version history of your files
revert back to an older version if you screw something up
organize a set of versions of files into a "release", that you can
publish for your users
help to facilitate multiple group members simultaneously working
on a project (and even on the same file!)
help to identify and resolve editing conflicts
SVN is intended mainly for source code, and not large datasets or binary
documents, although you can use it to store them too if you wish.
In the following tutorial, we will demonstrate how to set up
a repository for your research group, and perform some basic tasks with it.
Example Repository
In this example, let's create a repository for our research group. We'll
create several projects inside, and add some files to these projects. The
best place to create our repository is probably in our Group Saved area,
since it's safely backed up.
[araim1@maya-usr1 ~]$ svnadmin create /home/araim1/gobbert_saved/myrepos
[araim1@maya-usr1 ~]$
We now have an empty repository, so let's add a few empty projects. A Subversion
directory is very similar to a filesystem directory, in that we can add files and other
directories to it.
[araim1@maya-usr1 ~]$ svn mkdir file:///home/araim1/gobbert_saved/myrepos/project1
Committed revision 1.
[araim1@maya-usr1 ~]$ svn mkdir file:///home/araim1/gobbert_saved/myrepos/project2
Committed revision 2.
Notice the special "file://" URL syntax used to locate the repository on
local storage. Each time we do "svn mkdir", an editor window comes up with the
following text:
--This line, and those below, will be ignored--
A file:///home/araim1/gobbert_saved/myrepos/project1
In this first line you can type something like "I added a new project". This
message will be saved into the project's history, which you can view later.
If you get a message saying something like this
[araim1@maya-usr1 ~]$ svn mkdir file:///home/araim1/gobbert_saved/myrepos/project1
svn: Could not use external editor to fetch log message; consider setting the
environment variable or using the --message (-m) or --file (-F) options
svn: None of the environment variables SVN_EDITOR, VISUAL or EDITOR is set, and no
'editor-cmd' run-time configuration option was found
[araim1@maya-usr1 ~]$
you can tell Subversion which editor you'd like to use by setting an environment variable,
and then you may proceed with your "svn mkdir" command.
[araim1@maya-usr1 ~]$ export EDITOR=vi
After you save your message, the project should be added to the "myrepos"
repository.
Now let's suppose we want to start working on project 1. We should never
edit the repository directly. Instead, we check out a working copy of the
project, make our changes to the working copy, and check in our changes when
we finish.
[araim1@maya-usr1 ~]$ svn co file:///home/araim1/gobbert_saved/myrepos/project1
Checked out revision 2.
Now we'll add a text file with some important information
[araim1@maya-usr1 project1]$ cd project1
[araim1@maya-usr1 project1]$ echo "here are some contents" >> testfile.txt
[araim1@maya-usr1 project1]$ svn add testfile.txt
A testfile.txt
[araim1@maya-usr1 project1]$ svn commit testfile.txt
Adding testfile.txt
Transmitting file data .
Committed revision 3.
[araim1@maya-usr1 project1]$
Notice how we needed to add the file to the project, after we created it.
The "add" doesn't take effect until we finally commit the file at the end.
Now let's check the history of project 1 and testfile.txt.
[araim1@maya-usr1 project1]$ svn log file:///home/araim1/gobbert_saved/myrepos/project1
------------------------------------------------------------------------
r3 | araim1 | 2009-12-05 03:28:26 -0500 (Sat, 05 Dec 2009) | 2 lines
Added an important file
------------------------------------------------------------------------
r1 | araim1 | 2009-12-05 03:19:39 -0500 (Sat, 05 Dec 2009) | 2 lines
Added project1
------------------------------------------------------------------------
[araim1@maya-usr1 project1]$
[araim1@maya-usr1 project1]$ svn log file:///home/araim1/gobbert_saved/myrepos/project1/testfile.txt
------------------------------------------------------------------------
r3 | araim1 | 2009-12-05 03:28:26 -0500 (Sat, 05 Dec 2009) | 2 lines
Added an important file
------------------------------------------------------------------------
[araim1@maya-usr1 project1]$
Remote access to repository
Another benefit of source control is that we can work on a remote machine,
and easily keep all the working copies synced, whether local or remote.
Suppose we are working on GL, and we want to work on project 1 from
myrepos on maya.
araim1@linux1.gl.umbc.edu[8]$ svn co svn+ssh://maya.rs.umbc.edu/home/araim1/gobbert_saved/myrepos/project1
A project1/testfile.txt
Checked out revision 3.
We'll append some text to testfile.txt
araim1@linux1.gl.umbc.edu[15]$ cd project1/
araim1@linux1.gl.umbc.edu[16]$ echo "more contents" >> testfile.txt
araim1@linux1.gl.umbc.edu[17]$ svn commit testfile.txt
Sending testfile.txt
Transmitting file data .
Committed revision 4.
araim1@linux1.gl.umbc.edu[17]$
Then we'll add a new subdirectory with another text file
araim1@linux1.gl.umbc.edu[18]$ mkdir results
araim1@linux1.gl.umbc.edu[19]$ echo "some contents" >> results/output.txt
araim1@linux1.gl.umbc.edu[20]$ svn add results
A results
araim1@linux1.gl.umbc.edu[21]$ svn commit results
Adding results
Committed revision 5.
araim1@linux1.gl.umbc.edu[21]$
We can go back to our working directory on maya, and update it with those
changes - automatically
[araim1@maya-usr1 project1]$ svn update
A results
U testfile.txt
Updated to revision 5.
[araim1@maya-usr1 project1]$ ls -R
.:
results testfile.txt
./results:
output.txt
[araim1@maya-usr1 project1]$
If we had any uncommitted changes in our working copy, SVN would help us
handle any conflicts. We would be forced to compare our version to the
one from the repository, to ensure that our work is up to date.
There are also more advanced usages as well. It's possible to create a
"tag" for a project when you reach a certain milestone - e.g. version_1.0.0.
This makes it easy to keep track of which versions of individual files made it
into version 1.0.0 of our program. Even more advanced usages of source
control are branching and merging, which we won't go into here. These concepts
take some getting used to, but can be very powerful for collaborating with your
group members.
For more information, try running "svn help" at the command line. Also
see the
Subversion project page.
Note for Windows users: there is a nice graphical front-end for SVN called
Tortoise. It's open source, so
you can download it for free.