TAcS web site

This site holds the basic information needed to be able to use the
repositories located in the tacs users home directory.

It used to be a CVS-repository, but it has been converted to Subversion.
This has been done for 2 reasons




To read this tutorial you need to be familiar with
a few Unix/Linux command line tools:


ls - list content of (current) directory
cd - change directory
pwd - print working directory
mkdir - make directory
ln - make link between files (or directories)




Short introduction to Subversion

Bart and Lisa want's to collaborate on an essay, both of them being nerds
Latex is naturally the tool of choice. Lisa starts writing the essay
and emails her introduction to Bart. Bart is pleased with the results
but makes a few alterations, and sends it back to Lisa. Some of the
typos that Bart has located, Lisa has already found, but she manually
finds out which new improvements Bart has found, and sends the latest
version back to Bart. At this point, Bart has made a few alterations
to the introduction, which he tries to "brade" into the latest version
from Lisa. Both of them being long time Linux users, 'diff' and 'patch'
are heavily used to make one essay of the two versions.

At some point they agree that the only way this collaboration will ever work
is by a strict regime which only lets one of them work on the essay on a given
day. Lisa uses one of her days off to google the web for some
version control tools, and locates CVS , Subversion and darcs .
Lisa being the clever one, understands right away that Subversion is the tool
of choice since Bart always has a bit of a struggle with technical things.
Lisa sets up a repository on her home directory at the University of Oslo.
This is only a matter of creating a directory and using the svnadmin create tool


nelja:lisas> cd /hom/lisas/
nelja:lisas> mkdir svnroot
nelja:lisas> svnadmin create /hom/lisas/svnroot

Lisa has her version of the essay located in one of her subdirectories at the University
so she imports this directory as the main working directory. The directory which
holds her essay is called theEssay .


nelja:lisas> svn import /hom/lisas/theEssay file:///hom/lisas/svnroot/theEssay -m "initial import"

Naturally Lisa wants a controlled version of her 'essay directory' on her ifi-account
so she creates a directory where she can have her version controlled files.


nelja:lisas> cd /hom/lisas
nelja:lisas> ls

svnroot theEssay www_docs

nelja:lisas> mkdir svn
nelja:lisas> ls

svnroot theEssay www_docs svn 

Now all Lisa has to do is to check out a version which is stored in the
Subversion 'database'.
Lisa already has these files in the theEssay directory naturally, but
these files are not under version control, so to avoid all the emailing and
administration that this collaboration led to, she will use a version
controlled set of files from now on.

Lisa does a checkout of the version controlled theEssay directory


nelja:lisas> cd svn
nelja:svn> svn checkout file:///hom/lisas/svnroot/theEssay
nelja:svn> ls

theEssay

The directory she imported into Subversion has now been
checked out somewhere else in her file-tree, at first site they
seem to be identical.
But then she notices that there is a new directory called .svn
located inside the checked out version of theEssay directory.
The original theEssay directory looked like this:


theEssay/
|
|-- collaboration.aux
|-- collaboration.dvi
|-- collaboration.log
|-- collaboration.ps
`-- collaboration.tex

The directory checked out from Subversion looks like this:


theEssay/
|
|-- .svn
|   |-- README.txt
|   |-- empty-file
|   |-- entries
|   |-- format
|   |-- prop-base
|   |-- props
|   |-- text-base
|   |-- tmp
|   |   |-- prop-base
|   |   |-- props
|   |   |-- text-base
|   |   `-- wcprops
|   `-- wcprops
|
|-- collaboration.aux
|-- collaboration.dvi
|-- collaboration.log
|-- collaboration.ps
`-- collaboration.tex


Lisa being clever, understands rigth away that this is how Subversion
keeps track of how files develope over time, namely by keeping
copies of the original files in some directory (.svn), and then comparing these
to the ones in the original directory. This way Subversion can immediately see what files
have been modified and which files haven't. Next time Lisa uploads her changes
Subversion will only have to upload actual changes, since the files
that are not modified will be identical, and that way we save a lot of time
by only uploading/downloading changes, not the entire new set of files.

Lisa notices a few typos in the collaboration.tex file rigtht away,
and decides to make a few changes to this file. After that has been
done she saves the file, and wants to know whether Subversion has noticed
her modification of the file. After reading a bit on the internet
she notices the Subversion command status which
should be able to tell her what sort of status Subversion thinks
this file is in.


nelja:svn> ls

theEssay

nelja:svn> cd theEssay      (this is the version controlled 'theEssay' directory)
nelja:theEssay> ls

collaboration.aux
collaboration.dvi
collaboration.log
collaboration.ps
collaboration.tex

nelja:theEssay> svn status 

M      theEssay/collaboration.tex


Lisa thinks this means that Subversion
believes the file collaboration.tex has been modified (M).

Lisa decides to upload (commit) her changes to the
repository and call up Bart with the good news!


nelja:lisas> cd svn/theEssay
nelja:lisas> svn commit -m "Lisa's first upload of new collaboration.tex"

Now Lisa has to persuade Bart to use this incredibly adwanced technology
to make this essay collaboration work.
Bart immediately says this Subversion stuff is way to hard to learn, and claims that the
old way of doing it was just as good, in fact maybe even better.

After a couple of days of arguing Bart checks out the repository
"just to shut her up", and starts working with the files in that directory
instead of his old directory, admitting after a while that it feels almost the same.




WorkFlow

A repository is nothing but a file-tree with some
meta-information about the files in the .svn directories.

Typical usage 1:

  1. check out local version of repository
  2. modify files
  3. commit changes to repository

Typical usage 2:

  1. update local repository
  2. resolve conflicts
  3. modify files
  4. commit changes to repository


checkout


-- check out repository when logged in on ifi


nelja:bjarneh> mkdir -p where/i/would/like/to/have/my/repository
nelja:bjarneh> cd where/i/would/like/to/have/my/repository
nelja:repository> svn checkout file:///ifi/fenris/p13/tacs/svnroot/trunk
nelja:repository> ls trunk
kurs papers tex svn-book.pdf





-- check out repository using ssh (must be member of tacs-group)

nelja:bjarneh> mkdir tacs
nelja:bjarneh> cd tacs
nelja:tacs> pwd

/ifi/fenris/i03/bjarneh/tacs

nelja:tacs> ln -s /ifi/fenris/p13/tacs/svnroot/ .
nelja:tacs> ls

svnroot


now you have a symbolic link to the repository tree
and you know where your home directory is located
the following takes place on a local machine far far away


bjarneh@localmachine$ mkdir -p where/i/would/like/to/have/my/repository
bjarneh@localmachine$ cd where/i/would/like/to/have/my/repository
bjarneh@localmachine$ svn checkout svn+ssh://bjarneh@login.ifi.uio.no/ifi/fenris/i03/bjarneh/tacs/svnroot/trunk

password: 
password: 
password: 

bjarneh@localmachine$ ls trunk
kurs papers tex svn-book.pdf


(FIRST TIME YOU CHECK OUT, PASSWORD MUST BE WRITTEN 3 TIMES!!!)


modify


-- modify a file in repository (REGULAR MODIFICATION) 

nelja:bjarneh> cd path/to/local/repository
nelja:repository> emacs src/java/SomeFile.java

*  make some alterations  *

nelja:repository> svn status

M       src/java/SomeFile.java


(Subversion states that this file has been locally modified)






-- modify a file in repository (REMOVE) 

nelja:bjarneh> cd path/to/local/repository
nelja:repository> svn rm src/java/SomeFile.java
nelja:repository> svn status

D       src/java/SomeFile.java


(Subversion states that this file has been deleted locally)






-- modify a file in repository (MOVE) 

nelja:bjarneh> cd path/to/local/repository
nelja:repository> svn mv src/java/SomeFile.java new/path/to/file/
nelja:repository> svn status

D       src/java/SomeFile.java
A       new/path/to/file/SomeFile.java

(Subversion states that this file has been locally moved)






-- modify repository (ADD CONTENT) 

nelja:bjarneh> cd path/to/local/repository
nelja:repository> mkdir newDirectory
nelja:repository> echo "im a new file" > newDirectory/newFile.txt
nelja:repository> svn status

?       newDirectory


(Subversion states that this directory is not under version control)


nelja:repository> svn add newDirectory

A      newDirectory
A      newDirectory/newFile.txt


(Subversion adds content recursively)



commit


-- commit your changes on entire repository

nelja:bjarneh> cd path/to/repository
nelja:repository> svn commit -m "this message will show up in the commit-log"




-- commit your changes on single file

nelja:bjarneh> cd path/to/repository
nelja:repository> svn commit path/to/file.txt -m "commiting changes to file.txt for some reason"



update


-- update entire repository:

nelja:bjarneh> cd path/to/local/repository
nelja:repository> svn up



-- update someFile.txt in repository:

nelja:bjarneh> cd path/to/local/repository
nelja:repository> svn up path/to/SomeFile.txt 

conflict


nelja:bjarneh> cd path/to/repository
nelja:repository> svn up

Updated to revision 23

C       src/java/ThreadMaster.java


nelja:repository> ls src/java/ThreadMaster.java*

ThreadMaster.java
ThreadMaster.java.mine
ThreadMaster.r22
ThreadMaster.r23



you have three choices


- merge conflict by hand
- copy on of the temporary files on top of the ThreadMaster.java file
- svn revert ThreadMaster.java (remove your own changes on the file)



nelja:repository> less src/java/ThreadMaster.java

<<< .mine
import java.util.Fector;
===
import java.util.Vector;
>>> .r23


you can modify the file,
remove the temporary files by hand (rm ThreadMaster.r* ThreadMaster.mine) or run

nelja:bjarneh> svn resolved






TO GET THE FULL STORY CHECKOUT THE REPOSITORY AND READ  trunk/svn-book.pdf


comments can be mailed to: bjarneh