Setting Up A Subversion Repository Using Apache, With Auto Updatable Working Copy - Page 2

Creating a repository:

Suppose I want to create a Repository at /usr/local/subversion/repository using fsfs database so execute the command:

mkdir -v /usr/local/subversion/
/usr/bin/svnadmin create --fs-type fsfs /usr/local/subversion/repository

That should create a subversion repository under /usr/local/subversion/repository.

ls /usr/local/subversion/repository
conf/  dav/  db/  format  hooks/  locks/  README.txt

You should be able to see those files under the repository directory.


Setting up httpd.conf to serve the created repository:

Add the following lines to httpd.conf or the appropriate apache configuration file.

<Location /subversion>

  DAV svn

  SVNPath /usr/local/subversion/repository/


Make sure that the module mod_dav is loaded in the apache configuration file and is also present under modules directory.


Setting up authentication:

For the authentication we need to make changes to the apache configuration yet another time.

Basic authentication requires that we just add the following lines to the httpd.conf where we added the svn repository earlier.

AuthType Basic

AuthName "{Name of the authentication popup tab}"

AuthUserFile {Location of the password file}

Require valid-user

So it should look like this.

<Location /subversion>

  DAV svn

  SVNPath /usr/local/subversion/repository/

  AuthType Basic

  AuthName "Subversion repository"

  AuthUserFile /usr/local/subversion/repository/conf/svn-auth-file

  Require valid-user


It is necessary that we add users to the password file before anyone can access it, which is described in the next step.


Adding SVN users:

Since we are using svn with an apache server, and an apache basic authentication method.

We need to create a password file with the htpasswd binary provided with a standard apache installation.

htpasswd -cmd /usr/local/subversion/repository/conf/svn-auth-file {user-name}

-c option creates a new htpasswd file.

-m encrypts the password with an MD5 algorithm.

-d encrypts the password with a CRYPT algorithm.

Where {user-name} stands for an actual user name that will be used for authentication.

Warning: We should not use the -c option once we have added the first user. Using so will create and replace all existing user within the file.

htpasswd -md /usr/local/subversion/repository/conf/svn-auth-file {user-name}


Setting up the initial repository layout:

A repository mostly contains 3 standard folders.


For creating those standard folders in a repository, create a temporary folder anywhere you want, /tmp would be a good idea, with the following subdirectories.

mkdir -pv /tmp/subversion-layout/{branches,tags}

After we have made all the layout folders, move all the contents of your project to the trunk folder.

mv -v /usr/local/apache2/htdocs /tmp/subversion-layout/trunk

Then make an initial import of the temporary created directory.

/usr/local/subversion/bin/svn import /tmp/subversion-layout/

This will setup you up with a default repository layout, and make a first revision.


Setting up a working copy:

We can delete the temporary folders we created in the last step, since all the files are already in the repository.

Now what we need to do is to make a working copy of all the files in the repository under /usr/local/apache2/htdocs.

So that whenever a developer updates the php codes, they can see the code changes taking effect in a working environment.

But setting up a working copy would not accomplish this task, we would need to make the hook scripts to work with a working copy.

Thus, whenever a developer commits to the repository, the hook script will run itself, and update the working copy.

Make sure that htdocs folder under /usr/local/apache2/doesn’t already exist.

If you want you can rename it to htdocs_old.

To setup a working copy, do the following.

cd /usr/local/apache2/
su – apache
/usr/local/subversion/bin/svn checkout htdocs


Setting up the hook scripts:

A hook is a program triggered by some repository event, such as the creation of a new revision or the modification of an unversioned property. Each hook is handed enough information to tell what that event is, what target(s) it's operating on, and the username of the person who triggered the event. Depending on the hook's output or return status, the hook program may continue the action, stop it, or suspend it in some way.

The hooks subdirectory is, by default, filled with templates for various repository hooks.

post-commit.tmpl          post-unlock.tmpl          pre-revprop-change.tmpl
post-lock.tmpl            pre-commit.tmpl           pre-unlock.tmpl
post-revprop-change.tmpl  pre-lock.tmpl             start-commit.tmpl

For now, I will be discussing about the post-commit hook script, since that is what we need in our case.

Copy the post-commit.tmpl file into post-commit in the same hooks directory, and give post-commit execution rights.

cp -v /usr/local/subversion/repository/hooks/post-commit.tmpl /usr/local/subversion/repository/hooks/post-commit
chmod +x /usr/local/subversion/repository/hooks/post-commit

Now edit the post-commit script and comment the follow two lines at the bottom, and add the following line to it. "$REPOS" "$REV" [email protected] --repository "$REPOS" --revision "$REV"

/usr/bin/svn update /usr/local/apache2/htdocs/ >> /usr/local/subversion/repository/logs/post-commit.log

After doing that, make a new folder logs, under /usr/local/subversion/ so that we can enable logging, and create a blank the post-commit.log file.

mkdir -v /usr/local/subversion/repository/logs/
touch /usr/local/subversion/repository/logs/post-commit.log

Once again, we need to make sure the repository folder has the proper user ownership, it is advised to set ownership on /usr/local/subversion/repository/ for user apache.

chown -Rv apache.apache /usr/local/subversion/repository/

If all goes well, that's should be it.

You now have a working subversion repository server up which is ready for further imports, as soon as you start the apache server.

Share this page:

2 Comment(s)