SVN Branch/Merge tutorial

NOTE: THE EXAMPLES ARE DONE ON ALFS PC, AND ANY DIRECTORY NAMES CONTAINING “alfg” ARE NOT VALID ON YOUR PC!! USE SOME NAMES WHICH MAKE SENSE ON YOUR PC!

PART 1 : Create a repository and put a file there

CREATE A REPOSITORY

alfg@pc4400:~$svnadmin create $HOME/svnrepos

CREATE A WORKING DIRECTORY WITH CODE

alfg@pc4400:~$mkdir $HOME/testproject

Use the following as the file test.F90:

program test
implicit none
real, parameter :: a=4.0
real, parameter :: b=5.0
print*, "a is " , a
print*, "b is " , b
print*, "a+b is " , a+b
end program test

CD TO WORKING DIRECTORY AND VERIFY THAT THE TEST FILE IS THERE

alfg@pc4400:~/testproject$ ls -l
total 4
-rw-rw-r-- 1 alfg alfg 166 Dec 6 14:51 test.F90

CD TO THE FRESHLY CREATED REPOSITORY AND CREATE “testproject”

alfg@pc4400:~/svnrepos$ svnadmin create testproject

IMPORT YOUR WORKING-DIRECTORY TO THE REPOSITORY

alfg@pc4400:~$svn import $HOME/testproject/ file://$HOME/svnrepos/testproject/trunk -m "Initial version of testproject"

MAKE A BRANCHES-DIRECTORY

alfg@pc4400:~$svn mkdir file://$HOME/svnrepos/testproject/branches/ -m "created branches directory"

==>YOU NOW HAVE A REPOSITORY CONTAINING TRUNK AND (EMPTY) BRANCHES DIRECTORY. YOU CAN START TO USE IT

PART 2: Create a working directory for two developers

alfg@pc4400:~$mkdir twoDevelopers
alfg@pc4400:~$cd twoDevelopers

CHECK OUT TRUNK FOR ONE DEVELOPER

alfg@pc4400:~$svn checkout file://$HOME/svnrepos/testproject/trunk trunk
alfg@pc4400:~$cd trunk

CREATE A BRANCH BASED ON TRUNK

alfg@pc4400:~/twoDevelopers/trunk$ svn copy file://$HOME/svnrepos/testproject/trunk file://$HOME/svnrepos/testproject/branches/aBranch -m "created branch aBranch"

CD BACK ONE STEP AND CHECK OUT THE BRANCH FOR THE OTHER DEVELOPER

alfg@pc4400:~/twoDevelopers$ svn checkout file://$HOME/svnrepos/testproject/branches/aBranch aBranch

==> THE DIRECTORY “TWODEVELOPERS” NOW HAS TWO DIRECTORIES, ONE WITH TRUNK AND ONE WITH A BRANCH VERIFY THAT THEY ARE THERE USING THE “LS” COMMAND

alfg@pc4400:~/twoDevelopers$ ls -trl
total 8
drwxrwxr-x 3 alfg alfg 4096 Dec 9 08:36 trunk
drwxrwxr-x 3 alfg alfg 4096 Dec 9 09:40 aBranch

PART 3: Create conflict in the file test.F90

EDIT FILE ON TRUNK

alfg@pc4400:~/twoDevelopers/trunk$ vim test.F90
alfg@pc4400:~/twoDevelopers/trunk$ svn commit -m "added hello"
alfg@pc4400:~/twoDevelopers/trunk$ svn update

EDIT FILE ON BRANCH

alfg@pc4400:~/twoDevelopers/aBranch$ vim test.F90
alfg@pc4400:~/twoDevelopers/aBranch$ svn commit -m "added Hi man"
alfg@pc4400:~/twoDevelopers/aBranch$ svn update

==> We have now created a conflict between the branch “aBranch” and “trunk”

alfg@pc4400:~/twoDevelopers$ diff aBranch/test.F90 trunk/test.F90
9c9
<	print*, "Hi Man! a+b is " , a+b
---
>	print*, "Hello a+b is " , a+b

PART 4: Test the merge dialog

TRY TO MERGE TRUNK INTO BRANCH

alfg@pc4400:~/twoDevelopers/aBranch$ svn merge file://$HOME/svnrepos/testproject/trunk

You will get the message that there is a conflict in file test.F90, you will have to resolve the conflict Push the “postpone” option to quit the merge dialog

UNDO THE MERGE WITH

alfg@pc4400:~/twoDevelopers/aBranch$ svn revert -R .

==> You have undone the merge, nothing has happened

alfg@pc4400:~/twoDevelopers/aBranch$ svn diff
alfg@pc4400:~/twoDevelopers/aBranch$

PART 5: Set up favourite editor as merge tool

1) Create a file somewhere in your pc, for example I use $HOME/bin/mergetoolscript.sh

For emacs users, the content of the script is:

#!/bin/sh
emacs -q --eval "(ediff-merge-files-with-ancestor "\"$2"\" \""$3"\" \""$1"\" nil \""$4"\")"

For vi users, the content of the script is:

#!/bin/sh
vim -d "+diffsplit $3" "+vert diffsplit $1" "+vert diffsplit $2" -o $4

2) Open your $HOME/.subversion/config file and replace the line with merge tool

merge-tool-cmd = /home/alfg/bin/mergetoolscript.sh

(NOTE THAT FULL PATH IS NEEDED. NO BLANK CHARACTERS AT BEGINNGING OF LINE!!)

MAKE SURE SCRIPT IS EXECUTABLE

chmod +x $HOME/bin/mergetoolscript.sh

==> You should now have working merge tools. This will make merging EASY!!