FreeBSD Handbook
Prev | Appendix A. Obtaining FreeBSD | Next

# A.6 Using Subversion

## A.6.1 Introduction

As of July 2012, FreeBSD uses Subversion (svn) as the primary version control system for storing all of FreeBSD's source code, documentation, and the Ports Collection.

> Note: Subversion is generally a developer tool. Most users should use FreeBSD Update to update the FreeBSD base system, and Portsnap to update the FreeBSD Ports Collection.

In Subversion, URLs are used to designate a repository, taking the form of `protocol://hostname/path`. Mirrors may support different protocols as specified below. The first component of the path is the FreeBSD repository to access. There are three different repositories, `base` for the FreeBSD base system source code, `ports` for the Ports Collection, and `doc` for documentation. For example, the URL `svn://svn0.us-east.FreeBSD.org/ports/head/` specifies the main branch of the ports repository on the `svn0.us-east.FreeBSD.org` mirror, using the `svn` protocol.

## A.6.2 Installation

Subversion must be installed before it can be used to check out the contents of any of the repositories. If a copy of the ports tree is already present, one can install Subversion like this:

    # cd /usr/ports/devel/subversion
    # make install clean

If the ports tree is not available, Subversion can be installed as a package:

    # pkg_add -r subversion

If pkgng is being used to manage packages, Subversion can be installed with it instead:

    # pkg install devel/subversion

## A.6.3 Running Subversion

The `svn` command is used to fetch a clean copy of the sources into a local directory. The files in this directory are called a local working copy.

> Warning: If the local directory already exists but was not created by `svn`, rename or delete it before the checkout. Checkout over an existing non-`svn` directory can cause conflicts between the existing files and those brought in from the repository.

A checkout from a given repository is performed with a command like this:

    # svn checkout svn-mirror/repository/branch lwcdir

where:

- `svn-mirror` is a URL for one of the Subversion mirror sites.

- `repository` is one of the Project repositories, i.e., `base`, `ports`, or `doc`.

- `branch` depends on the repository used. `ports` and `doc` are mostly updated in the `head` branch, while `base` maintains the latest version of -CURRENT under `head` and the respective latest versions of the -STABLE branches under `stable/8` (for 8.`x`) and `stable/9` (9.`x`).

- `lwcdir` is the target directory where the contents of the specified branch should be placed. This is usually `/usr/ports` for `ports`, `/usr/src` for `base`, and `/usr/doc` for `doc`.

This example checks out the Ports Collection from the western US repository using the HTTPS protocol, placing the local working copy in `/usr/ports`. If `/usr/ports` is already present but was not created by `svn`, remember to rename or delete it before the checkout.

    # svn checkout https://svn0.us-west.FreeBSD.org/ports/head /usr/ports

Because the initial checkout has to download the full branch of the remote repository, it can take a while. Please be patient.

After the initial checkout, the local working copy can be updated by running:

    # svn update lwcdir

To update `/usr/ports` created in the example above, use:

    # svn update /usr/ports

The update is much quicker than a checkout, only transferring files that have changed.

An alternate way of updating the local working copy after checkout is provided by the `Makefile` in the `/usr/ports`, `/usr/src`, and `/usr/doc` directories. Set `SVN_UPDATE` and use the `update` target. For example, to update `/usr/src`:

    # cd /usr/src
    # make update SVN_UPDATE=yes

## A.6.4 For More Information

For other information about using Subversion, please see the “Subversion Book”, titled Version Control with Subversion, or the Subversion Documentation.

Prev | Home | Next
Using CTM | Up | Subversion Mirror Sites