Subversion is an open-source control version system that is a compelling replacement for CVS. At least the client version is installed by default on all our Linux machines, and can be easily installed on Macs via fink or macports.
The basic idea is to keep a master copy of your source files in a repository where the subversion also keeps track of all the (committed) modifications to the files. For editing a file, one have to check it out (e.g. get a local copy) from the repository.
Once the editing is done, the modifications are committed back to the server. This allows more than one person (or the same person on many computers) to work on the same set of files because they are actually working on their local copy of the files.
When a user commits his changes, the files he/her has been editing might have been changed (and committed) by another user in the mean while. In this case, subversion merges the changes automatically unless it detects a conflict (e.g. two user having changed the same line of code).
Everyone can create his own subversion repository in his homedirectory with the following command:
svnadmin create --fs-type fsfs DIRECTORY_NAME
where DIRECTORY_NAME
name could be for example /home/cangiani/SVN
For group projects, it is better to use the common repository which is
Where REPONAME
is the name of the repository. You can see a list of repositories with ls
.
For example:
|~>ls /repos/lth CDMA introsc scaling CS iryna scripts LDPCequal isit05 shortcourse SourceCoding it2010-11 signalpc SourceCodingBP iterations sim aaaaa kr sim.donotuse abdel ldlc sim1 alsan ldpcdemo sim_zip ara leshouches sparsematrices aref limex stability book mac statphys cap matlabde statphys2010-11 cdi maxup subroutines comm maxwell talks commnet minsum temp consensus mobility test corrdecay ncaref test1 coupled netflix testacl cyclecodes networkcoding testacl1 densevol newintrosc testdamir density_evolution paris05 thesiskorada dsp2010-11 pdc treereconstruction errorfloor polargaussian turbo flipping polarization turboweight2 gf pspin twod girthvsdiam puncturing vinodhPhD gossip racodes vish graphreconstruction ratesplitting weight_conc ibm samplede
Almost everything is done with the svn
command. In fact it is a super command as it accepts many internal commands. Note that in this section, all the lines starting with xxxx>
are commands that I typed in as an example. By URL
, I mean a repository address as, for example svn+ssh: USERNAME@lth.epfl.ch/licos/SVN/trunk
. Arguments in square brackets are optionals. All commands that do not need an URL
are going to be used from withing a local copy under version control.
<note>
For a guide of CVS to SVN command follow this link.
</note>
The most common svn commands are:
I think you've guessed what it is for. Use it !
to list the content of the [remote] repository. For example:
damir@iscsrv7:~$ ls /repos/lth aaaaa coupled introsc matlabde polarization sim.donotuse testacl abdel CS iryna maxup pspin sim_zip testacl1 alsan cyclecodes isit05 maxwell puncturing SourceCoding testdamir ara densevol it2010-11 minsum quantique-2010-11 SourceCodingBP thesiskorada aref density_evolution iterations mobility racodes sparsematrices treereconstruction book dsp2010-11 kr ncaref ratesplitting stability turbo cap errorfloor ldlc netflix samplede statphys turboweight2 cdi flipping ldpcdemo networkcoding scaling statphys2010-11 twod CDMA gf LDPCequal newintrosc scripts subroutines vinodhPhD comm girthvsdiam leshouches NIPS shortcourse talks vish commnet gossip limex paris05 signalpc temp weight_conc consensus graphreconstruction loop_expansion pdc sim test corrdecay ibm mac polargaussian sim1 test1 damir@iscsrv7:~$ svn list svn+ssh://lth.epfl.ch/repos/lth/sim 36_BAWGNC_BP.ps 36_BAWGNC_BP_5.13625_7.ps 36_BAWGNC_MinSum.ps 36_BAWGNC_MinSum_5_10.ps 36_BEC_BP.ps 36_BSC_BP.ps data/ log param param36_1024_BEC_BP param36_8192_BSC_matched parambec plotheader.ps plotmidsection.ps plottrailer.ps pp36_1024_BEC_BP pp36_8192_BSC_BP_matched ppfiles/ pptops pptops36_BEC_BP protographexample pstemplate.ps scaling.ps simfiles/ trunk/
to get a local copy of [part of] the repository. For example, with
damir@iscsrv7:~$ mkdir test damir@iscsrv7:~$ cd test damir@iscsrv7:~/test$ svn co svn+ssh://lth.epfl.ch/repos/lth/sim sim
I would get a copy of the sim program source code inside the just created test directory. The sim directory name above (the last parameter in the svn co command line) is not mandatory. If omitted, svn will just use the name of the last directory in the repository (in this case “sim”). Now that I have my local copy under version control I can run all the following commands.
checks the status of my local copy. Without the -u option it only works locally so it does not tell if some of the file was modified in the repository. Still very useful to see what files I have modified. The command output something only if there is something interesting to say. No output means that there are no changes. For each changed file flag letters appears on the left (see svn help status for a full list). The most common letters are M
for locally modified, A
for locally added, D
for locally deleted, *
if a newer version exists in the repository, ?
if the file is not under version control (either it is a generated file such as a .o or .dvi file, or you just forgot to add it to the repository), C
if there are conflicts (and that's bad).
For example (this is the algo web site):
algo>svn status M intro.php algo>svn status -u * 1552 contents/output/diplomapr/baldanza_2005.pdf * 1552 contents/output/diplomapr * 1552 contents/output/diplomapr.html * 1552 contents/group/members.html * contents/proj/y5/06-01.html * 1552 contents/proj/y5 * 1552 contents/proj/diploma.html * 1552 contents/proj/y3.html * 1552 contents/proj/y5.html * 1552 contents/proj/mathsem.html M 1552 intro.php
This tells me that I've modified (M) the file intro.php and that various other files are newer (*) on the repository.
take new version of the file (of of all files if no filename is given) from the repository. It can happens that a file was modified on the repository, but also in your local copy. In this case, subversion tries to merge the two version. If it cannot, then a conflict is generated and you'll have multiple copies of the same file. You will need to resolve the conflict by choosing the correct version of the file, and running svn resolved [filename]
.
commit your changes: send a copy of the files that you've modified back to the server. In case, there are files in the repository that are newer than those being committed, the commit will fail and you will have to first update your copy (and eventually resolve the conflicts).
schedule a local file for being added to the repository. The file will be actually added only when you commit your changes.
schedule a file for “deletion” in the repository. The file is also immediately removed from your local copy. Note that under subversion file are never deleted from the repository. They are only deleted from the current version of the repository. You can always checkout an older version and have your file back.
svn rename old_filename new_filename svn rename -m "mandatory message" old_URL new_URL
rename a file or a directory either locally (that is schedule the change for the next commit) or directly on the repository.
prints the history of a file. Each time the file was modified and committed a new version number (rXXXX) and a the -m “comment” is attached to it. Example:
algo>svn log tunnel.cpp ------------------------------------------------------------------------ r1548 | cangiani | 2006-08-25 14:57:10 +0200 (Fri, 25 Aug 2006) | 1 line minor bug fixes ------------------------------------------------------------------------ r1544 | cangiani | 2006-08-24 13:58:17 +0200 (Thu, 24 Aug 2006) | 1 line Implemented multiple file streaming in sserver ------------------------------------------------------------------------ r1515 | cangiani | 2006-08-02 15:17:16 +0200 (Wed, 02 Aug 2006) | 1 line Nicer output again (removed useless debug messages) ------------------------------------------------------------------------ r1397 | cangiani | 2006-06-15 10:45:57 +0200 (Thu, 15 Jun 2006) | 1 line changed loss rate log ------------------------------------------------------------------------ r1376 | cangiani | 2006-06-13 11:06:10 +0200 (Tue, 13 Jun 2006) | 1 line Trying to fix the sserver 15 minutes crash bug. Now sclient seems to be more robust against sserver restart ------------------------------------------------------------------------ r1357 | cangiani | 2006-06-12 11:18:43 +0200 (Mon, 12 Jun 2006) | 1 line Added option for skipping to the end of the input file (good for live buffers, in particular, when sserver crashes). Added control for resetting internal block index if the block index in the incoming packet is much smaller (ib-ibcheck>5) than internal block index. This can happen if sserver has crashed and was relaunched ------------------------------------------------------------------------
you can always create a personal repository in your homedir by doing:
ssh lth.epfl.ch
svnadmin create <name_of_repository>
General repositories, that needs to be available under
ssh+svn://lth.epfl.ch/svn<LABNAME>/<REPOSITORY>
can be created only by the System Administrators.
To create a general repository you need to send an email with these informations:
fig1.eps
and file Fig1.eps
are two distinct files under Linux, but they are mapped to the same physical file, and therefore they cannot co-exist under OsX.
Every user has a personal global SVN configuration file which resides in ~/.subversion/config
. This file defines options that are valid for all repositories that the user works with.
The two most useful options are probably global-ignores
and autoprops
. global-ignores
defines a list of filename patterns that Subversion will ignore. For example, you can set it to
global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store \ .*.swp *.dvi *.aux *.log *.bbl *.blg *.idx *.ind *.ilgglobal-ignores = *.o *.lo *.la #*#
to ignore the specified files. The command svn status
will then no longer display these types of files preceded with a question mark if they are not in a repository.
One should be careful with *.log
as its possible there are files other than LaTeX processing files which end in .log
. To see which files are being ignored in a given directory, type
svn st --no-ignore
The option autoprops
causes Subversion to automatically set pre-defined properties for files whose names satisfy a given pattern. For example,
[auto-props] *.m = svn:keywords=Id *.tex = svn:keyword=Id
makes Subversion to automatically set the Id
keyword for all .m and .tex files that are added to a repository. (The Id
keyword tells Subversion that the string $Id$
in a file should be expanded to something like
$Id: sufficiency.tex 372 2008-02-11 16:10:53Z kleiner $
While the global-ignores
option explained above already covers a lot of cases, there are situations where you want Subversion to ignore a file that you cannot put in the global ignore list. For example, in a directory that contains a tex file, you'll want Subversion to ignore the corresponding ps or pdf files. Since you don't want Subversion to ignore all ps and pdf files everywhere, you cannot use global-ignores
. However, each directory in a Subversion repository has its own ignore list. You can edit a directory's ignore list by typing
svn propedit svn:ignore .
(the .
is part of the command; it indicates the current directory). This will fire up an editor (the one defined in the $EDITOR
environment variable), in which you can then edit and save the directory's ignore list.