Print service provided by iDogiCat: http://www.idogicat.com/
home logo





Home > IT > Programming > Subversion Usage

iDog's Guide of Subversion Usage

iDog

Download and install

Download subversion at its official website:

http://subversion.tigris.org/

You'd better download its source code and then build it in your local machine. It's pretty straightforward, so omitted here.

Create repository


mkdir -p /var/svn/myrepo
svnadmin create /var/svn/myrepo

Then configure the repository:

Open file /var/svn/myrepo/conf/svnserve.conf, uncomment the line starting with 'password-db':


# [general]
# password-db = passwd

Open file /var/svn/myrepo/conf/passwd, add accounts under '#[users]':


# [users]
idog = idog123
icat = icat456

Start svn daemon


svnserve --daemon --root /var/svn/myrepo

Import existing project

Suppose that we have a project in following dir:

/home/idog/myproj

Then do following commands to add it to repository:


svn mkdir svn://localhost/myproj
cd /home/idog/myproj
svn import . svn://localhost/myproj
svn commit

If you have an extra file/dir to add, then


svn add <file_or_dir_name>
svn commit

Add new files


svn add path/to/files

# add dir and all dirs/files under it
svn add my_dir

# only add dir
svn add --depth empty my_dir

Check in & check out code


svn co svn://localhost/myproj
# some modifications on files...
svn ci

Ignore some files


# ignore all *.log files in log dir
svn propset svn:ignore *.log ./log/

Revisions

1. Revision number: an integer

2. Revision Keywords

  • HEAD: latest revision
  • BASE: base of your working copy (without your modifications)
  • COMMITTED: last revision before or at BASE.
  • PREV: COMMITTED - 1

3. Revision Dates: svn finds the latest revision till this time.


{yyyy-mm-dd}
{yyyymmdd}
{hh:mm}
{hh:mm:ss.xxxxxx}
{"yyyy-mm-dd hh:mm"} # use "" since there is a space
{yyyymmddThhmm}
{yyyy-mm-ddThh:mm}

when time is not specified, svn assumes 00:00:00.


svn log -r {yyyymmdd}:{YYYYMMDD} #specify a range to log
svn diff -r {yyyymmdd}:nnnn # compare two versions

Basic work cycle

update working copy


svn update

Result in following format:

F filename

Flag 'F' meanings:


U   updated
A   added
D   deleted
R   replaced (deleted a file but added another with the same name)
G   merged successfully
C   merged with conflicts. need to be resolved manually.

Make changes to working copy

work on files, and use following commands:


svn add <filename>
svn delete <filename>
svn copy <file1> <file2>
svn move <file1> <file2>

Examine local changes


svn update

Result is as follows:

F filename

Flag 'F' meanings:


A   scheduled addition
C   in state of conflict
D   scheduled deletion
L   locked
M   modified
X   unversioned but is an external definition
?   not under version control
!   under version control but missing or incomplete
~   type mismatch (e.g.: versioned as dir, but is file)
I   unversioned, and svn is configured to ignore it


svn diff
svn diff > patch.txt


svn revert

revert: overwrite working copy with BASE, or cancel scheduled task (e.g.: cancel a deletion).

Resolve conflicts

  • do 'svn update', then modify all files flagged as 'C'.
  • modify conflicted files
  • run 'svn resolved <file>'
  • commit

When there is a conflict, 3 extra files are created:

  • <filename>.mine: working copy before doing update
  • <filename>.r<mmm>: BASE revision
  • <filename>.r<nnn>: file received from svn server when updating

Examine history


svn log
svn diff
svn cat # retrieve file of a revision and print it to screen
svn list # list files in a dir of a revision

Other commands


svn cleanup # clean up any unnecessary logs, remove locks

svn import # copy unversioned dir into repository.

svnadmin create /usr/lcoal/svn/my_repo
svn import mydir file:///usr/local/svn/my_repo/myproject

After import operation, this dir is not converted into a working copy.

Branches, Tags and Merges

In svn, branches and tags are simply copies.


svn mkdir svn://localhost/branches
svn copy svn://localhost/myproj svn://localhost/branches/myproj/1.0

If modifications are made in branch, we can use merge command to merge them back to main trunk:


svn merge -r nnn:HEAD svn://localhost/branches/myproj/1.0 .

Note that the 'nnn' means the base of the branch. For example, project started from r240, made the branch at r242, branch's top is r243, trunk's top is r244, then the command is:


(240)---(241)---(242)---(244)---(245)---------
                  | (branch)      | (merge)
                (242)---(243)-----+


svn merge -r 242:HEAD svn://localhost/branches/myproj/1.0 .