Apache Subversion
![]() |
Subversion is a revision control system which allows computer software to be developed in an incremental and controlled fashion by a distributed group of programmers. Also commonly referred to as svn or SVN, Subversion is designed specifically to be a modern replacement for CVS.[1] Subversion was created by CollabNet, who still maintain the project. The name "Subversion" is a trademark of CollabNet.[2]
Although as of 2006 Subversion is less widely used than the traditional CVS,[citation needed] adoption is increasing, and it is perhaps the most popular alternative.[citation needed] Projects using Subversion include the Apache Software Foundation, KDE, GNOME, GCC, Python, Samba, Mono and many others. SourceForge.net now also provides Subversion hosting for its open source projects, and the new Google Code and BountySource systems use it exclusively.
The latest Subversion release is 1.4.3, released on 25 January 2007. Released under the Subversion License, Subversion is open source software.
Features
- Commits are truly atomic operations. Interrupted commit operations do not cause repository inconsistency or corruption.
- Renamed/copied/moved/removed files retain full revision history.
- Directories, renames, and file metadata are versioned. Entire directory trees can be moved around and/or copied very quickly, and retain full revision history.
- Versioning of symbolic links.
- Native support for binary files, with space-efficient binary-diff storage.
- Apache HTTP server as network server, WebDAV/DeltaV for protocol. There is also an independent server process that uses a custom protocol over TCP/IP.
- Branching and tagging are cheap (constant time) operations.
- Natively client/server, layered library design.
- Client/server protocol sends diffs in both directions.
- Costs are proportional to change size, not data size.
- Parsable output, including XML log output.
- Open Source licensed — "CollabNet/Tigris.org Apache-style license"
- Internationalised program messages.
- File locking for unmergeable files ("reserved checkouts").
- Path-based authorization for svnserve.
- Python, Ruby, Perl, and Java language bindings.
- Full MIME support - the MIME Type of each file can be viewed or changed, with the software knowing which MIME types can have their differences from previous versions shown.
Repository access
As of version 1.4, Subversion repositories can be accessed by the following means:
- Local filesystem or network filesystem,[3] accessed by client directly.
- WebDAV/DeltaV (over http or https) using the mod_dav_svn module for Apache 2.
- Custom "svn" protocol (default port 3690), using plaintext or over SSH.
All three means can access both FSFS and Berkeley DB repositories.
Layers
Subversion is composed internally of several libraries arranged as layers. Each performs a specific task and allows developers to create their own tools at the desired level of complexity and specificity.
- Fs
- The lowest level; it implements the versioned filesystem which stores the user data.
- Repos
- Concerned with the repository built up around the filesystem. It has many helper functions and handles the various 'hooks' that a repository may have, e.g. scripts that are run when an action is performed. Together, Fs and Repos constitute the "filesystem interface".
- mod_dav_svn
- Provides WebDAV/DeltaV access through Apache 2.
- Ra
- Handles "repository access", both local and remote. From this point on, repositories are referred to using URLs, i.e. file:///path/ for local access, http://host/path/ (or https) for WebDAV access, or svn://host/path/ (or svn+ssh) for the SVN protocol.
- Client, Wc
- The highest level. It abstracts repository access and provides common client tasks, e.g authenticating the user, or comparing versions. The Wc library is used by Client to manage the local working copy.
Filesystem
The Subversion filesystem is described as a "three dimensional" filesystem. Since most representations of a directory tree (e.g tree view) are two dimensional, the added dimension is that of revisions. Each revision in a Subversion filesystem has its own root, which is used to access contents at that revision. Files are stored as links to the most recent change; thus a Subversion repository is quite compact. The storage space used is proportional to the amount of changes made, not to the number of revisions.
The Subversion filesystem uses transactions to keep changes atomic. A transaction is begun from a specified revision of the filesystem, not necessarily the latest. The transaction has its own root, on which changes are made. It is then either committed and becomes the latest revision, or is aborted. The transaction is actually a long-lived filesystem object; a client does not need to commit or abort a transaction itself, rather it can also begin a transaction, exit, and then another client (perhaps the same program) can re-open the transaction and continue using it.
Properties
One important feature of the Subversion filesystem is properties, simple name=value pairs of text. Properties are used in two different places in the Subversion filesystem. The first is on filesystem entries i.e files and directories. These are versioned just like other changes to the filesystem. Users can add any property they wish, and the Subversion client uses a set of properties, which it prefixes with 'svn:'.
- svn:executable
- Makes files on Unix-hosted working copies executable.
- svn:mime-type
- Stores the MIME type of a file. Affects the handling of diffs and merging.
- svn:ignore
- A list of filename patterns to ignore in a directory. Similar to CVS's .cvsignore file.
- svn:keywords
- A list of keywords to substitute into a file when changes are made. The keywords must also be referenced in the file as $keyword$. This is used to maintain certain information (e.g date of last change, revision number) in a file without human intervention.
- svn:eol-style
- Makes the client convert end-of-line characters in text files. Used when the working copy is needed with a specific EOL style. "native" is commonly used, so that EOL's match the users OS EOL style. Repositories may require this property on all files to prevent inconsistent line endings, which can be a problem in itself.
- svn:externals
- Allows parts of other repositories to be automatically checked-out into a sub-directory.
- svn:needs-lock
- Specifies that a file needs an explicit lock to be taken out on it before being modified, stopping other people from modifying it at the same time.
- svn:special
- This property isn't meant to be set or modified directly by users. Currently only used for having symbolic links in the repository. When a symbolic link is added to the repository, an empty file is created with this property. When a Unix-like system checks out this file, the client converts it to a symbolic link.
The second place in Subversion where properties are used is on revisions themselves. Like the above properties on filesystem entries the names are completely arbitrary, with the Subversion client using certain properties prefixed with 'svn:'. However, these properties are not versioned and can be changed later.
- svn:date
- The date and time stamp of when the revision was made.
- svn:author
- The name of the user that submitted the change(s).
- svn:log
- The user-supplied description of the change(s).
Branching and tagging
Subversion uses the repository paths and file history to handle branches and tags. A new branch or tag is created with the 'svn copy' command, which should be used in placed of the native operating system mechanism. Subversion does not create an entire new file in the repository with its copy. Instead, the old and new files are internally linked together and the history is preserved for both. The copied files take up little extra room in the repository because Subversion only saves the differences from the original files.
The minimal layout recommended for a project repository looks similar to this with branches and tags added:
- project/
- trunk/
- branches/
- tags/
On larger projects, you'll see the above structure repeated throughout the repository at different levels in the project tree. The paths listed under tags are snapshots of the trunk on the same repository level, and they are commonly named after the release dates or version related to snapshot. The paths under tags are generally for read-only access once created.
- tags/
- 20050516/
- 20060320/
- 20070801/
The paths listed under branches are commonly named after subsequent minor versions (or subversions) of the current repository level, given names of certain features, or have cross reference information. Branches can form more repository levels and also have a trunk node. Here, you'll see the repeated layout as shown above as if the branches form new sub-projects of the project.
- branches/
- 1.2/
- trunk/
- tags/
- 1.2.3/
- branches/
- 2.0/
- trunk/
- tags/
- branches/
- 2.0.1/
- trunk/
- tags/
- branches/
- 2.0.1/
- 1.2/
The tags directory contains snapshots of the trunk at particular milestones, usually major releases or perhaps prior to a major departure in development.
The trunk directory holds the head version for each branch level.
The branches directory holds versions (or subversions) of the project that a developer or group of developers may be working on. Each trunk path is in alignment to merge changes with the trunk in the level above each other. The changes can be merged into the trunk above or into other branches. This not only allows changes to be checked into the repository and shared separately; it also allows implementations models to be distributed across the repository and provides access to previous versions for maintenance.
It is not intended for someone check-out the entire project tree; instead, they need only to check-out one of the trunk paths or one of the tagged snapshots.
The tags were made by svn mechanisms, like the usual command line to copy a trunk to a new path:
- svn copy trunk tags/my-new-snapshot
Likewise, branch creation only requires a few extra steps to setup a new layout:
- svn mkdir branches/my-new-branch
- svn mkdir branches/my-new-branch/tags
- svn mkdir branches/my-new-branch/branches
- svn copy trunk branches/my-new-branch/trunk
All the files in each branch maintain the history of the file up to the point of the copy, plus any changes made since. Changes can be 'merged' back into the trunk or between branches. To Subversion, the only difference between tags and branches is that changes should not be checked into the tagged versions. Due to the differencing algorithm, creating a tag or a branch takes very little additional space in the repository.
![](http://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Subversion_project_visualization.svg/650px-Subversion_project_visualization.svg.png)
Current issues
![]() | This section needs expansion. You can help by adding to it. (January 2007) |
A number of issues with Subversion have been identified by the developers as well as users.
- No atomic 'move' or 'rename' operation. As of version 1.4, Subversion currently implements moving (or renaming) of files with two operations on the same atomic transaction: a 'copy' to the new name followed by a 'delete' of the old name.
- Subversion currently lacks proper repository administration and management tools. That is, while it is very capable when data is added to the repository, it is much less capable at managing the repository as a whole. For instance, it is sometimes necessary to permanently edit the repository to change the structure in which versions are held or to permanently remove data that was checked into the repository in error. Subversion does not have tools which allow this to be done. The check-in level tools allow files and directories to be moved or deleted but earlier revisions will always hold the data in the old structure or hold the file that was deleted. The current solution to this sort of problem involves 'dumping' the repository, editing the resulting (possibly large) text file, and then recreating the repository. For simple renaming or removal of files this is fairly straight-forward, but other alterations can be more complex and hence error-prone. (See http://subversion.tigris.org/issues/show_bug.cgi?id=516.)
These and other issues are described in the Subversion roadmap.
Subversion Binaries
The Subversion open source community does not provide binaries but these can be downloaded from volunteers and from CollabNet, the initiator of the Subversion open source project.
- Subversion binaries Links to binary Subversion packages are available on Tigris.org, the home of the Subversion project.
- CollabNet Subversion Subversion binaries compiled, certified and supported by CollabNet.
GUI front-ends/clients
- eSvn, a Qt-based Subversion client.
- gsvn, mostly abandoned by its original authors, due to lack of time; written entirely in python, using GTK+. There is a new project developed in C# with Mono also named gsvn.
- JSVN, a proof-of-concept Java Swing client.
- kdesvn, another Subversion client for KDE.
- psvn.el A Subversion interface for Emacs.
- QSvn, another Qt-based Subversion client.
- RapidSVN, a cross-platform (Linux, Win32, Mac OS X) GUI front-end written in C++ using the wxWidgets framework.
- SCPlugin, a Mac OS X plug-in for the Finder.
- SmartSVN is a cross-platform (Linux, Mac OS X, Win32) client for Subversion; available as a free Foundation version and as a commercial Professional version. It makes use of the SVNKit library, a pure Java implementation of Subversion.
- Subcommander, a cross-platform (Linux, Win32, Mac OS X) GUI front-end written in C++ using the Qt framework.
- svnX, a Mac OS X GUI front-end to command line Subversion.
- tkSVN, a Tcl/Tk-based combined Subversion and CVS client.
- TortoiseSVN, a Windows shell (i.e. Explorer) extension.
- WorkBench, cross-platform, written with wxPython and pysvn, an alternative, OO-style Python binding for the Subversion library.
- ZigVersion, a commercial Mac OS X Subversion client.
- Syncro SVN Client, a cross platform front-end.
Web-based clients
- bsSvnBrowser, a Ruby on Rails based web interface to Subversion provided by BountySource
- FishEye, browser interface for CVS and Subversion version control repositories by Cenqua
- Insurrection, a web interface for Subversion
- sventon, a pure Java Subversion repository web browser (open source).
- SVN::Web, a highly-configurable client, written in Perl, that supports cgi, mod_perl1, and mod_perl2
- ViewVC, browser interface for CVS and Subversion version control repositories by Tigris
- WebClient for SVN an open source cross-platform (Linux, Win32, Mac OS X) Subversion web client written in Java/JSP. It offers a convenient way of browsing the repository content and its history plus simple write operations
- WebSVN, a PHP based web interface of Subversion repositories
IDEs
List of IDEs, which support or can be integrated with Subversion:
- SlickEdit
- IntelliJ IDEA
- Xcode is Apple's Mac OS X IDE
- Microsoft Visual Studio
- AnkhSVN is a Visual Studio .NET addin. It allows to perform the most common Subversion operations from directly inside the VS.NET IDE
- VisualSVN is simple and reliable Subversion integration for Visual Studio 2003 and 2005
- PushOk SVN SCC PlugIn Another Visual Studio addin.
- Borland Delphi
- DelphiSVN Subversion integration for Borland Delphi
- Eclipse
- Subclipse is an open source project that integrates Subversion into Eclipse IDE
- Subversive Subversion plug-in for Eclipse IDE providing similar to CVS support
- EasyEclipse A software bundle that packages Eclipse and several other plug-ins and tools into a single installer. One of the Eclipse plug-ins included in this bundle is a Subversion plug-in
- Sybase PowerBuilder using SVNSCC from PushOK
- Zend Studio
- KDevelop
- Emacs
- NetBeans
- subversion.netbeans.org Subversion integration for NetBeans IDE
- JDeveloper
- Eric Python IDE
- ActiveState Komodo
Other related software
- CIA is a piece of software that notifies people of repository activity. It is named after the CIA because its role is to "keep an eye on subversion".
- CodeBeamer is collaborative development system that can integrate various version control systems including Subversion with functions of issue tracking, document management, discussion forums, project wiki spaces, source code browsing and analysis for multiple projects.
- CVS2SVN is a Python script that converts existing CVS repositories to Subversion repositories.
- VSS2SVN is a small tool that converts existing Visual Source Safe repositories to Subversion repositories.
- FSVS - versions complete filesystems or directories (including modification time, owner, group and access-mode) into a subversion repository.
- GForge is an open source project that integrates Subversion with bug tracking, messaging, project hosting.
- Information currency svn (icsvn)command-line client.
- Oxygen XML Editor's Subversion Client
- StatSVN, StatSVN is an open source program that generates graphical reports about SVN repositories
- Subversion сlient for FAR Manager
- SVN 1-Click Setup is an installer for setting up a Subversion repository on Windows.
- SVN2Log, SVN2Log generates changelogs from Subversion repository.
- SVN Importer is a free tool for importing content from other version control systems to a Subversion (SVN) repository
- SVNKit is an open source project that is a 100% pure Java Subversion client library.
- svnmerge, which helps keep track of what changes what merges have and have not occurred on branches.
- SVNManager, SVNManager is a webbased tool to administer a Unix Apache WebDAV Subversion repository server.
- SVNRevMailer SVNRevMailer is a small tool that e-mails reports of the changes in subversion repositories.
- Trac, Svnwiki, IkiWiki, SubWiki - integrates Subversion with Wiki software
- WANdisco, Multi-site, replication add-on for remote Subversion repositories.
- SharpForge, is an open source, c#, dot net 2.0, collaborative project hosting web application. It supports multiple portals, multiple projects, subversion administration, work item tracking, project forums, release management, subversion wiki, subversion browsing & news feed aggregation. The software is released under the New BSD License.
- LibreSource
References
- C. Michael Pilato, Ben Collins-Sussman, Brian W. Fitzpatrick; Version Control with Subversion; O'Reilly; ISBN 0-596-00448-6 (1st edition, paperback, 2004, full book online at http://svnbook.red-bean.com/)
- Garrett Rooney; Practical Subversion; Apress; ISBN 1-59059-290-5 (1st edition, paperback, 2005)
- Mike Mason; Pragmatic Version Control Using Subversion; Pragmatic Bookshelf; ISBN 0-9745140-6-3 (1st edition, paperback, 2005)
- William Nagel; Subversion Version Control: Using the Subversion Version Control System in Development Projects; Prentice Hall; ISBN 0-13-185518-2 (1st edition, paperback, 2005)
- ^ "Why does this project exist?". Subversion FAQ. CollabNet. Retrieved 2007-04-01.
- ^ [1]
- ^ Berkeley DB relies on file locking and thus should not be used on (network) filesystems which do not implement them
See also
- List of revision control software
- Comparison of revision control software
- SVK - which is compatible with SVN repositories, and avoids the large .svn metadata directories in the working copy
- SourceHaven - ports Subversion to an Oracle database and adds a web application for administration
External links
- Official site
- openCollabNet, online support community from CollabNet
- #svn, Subversion's IRC channel, on freenode
- Version Control with Subversion, an O'Reilly book available for free online
- Version control for non-programmers with Subversion
- CVS and Subversion: Combined Tutorial
- A Subversion user community
- Planet Subversion Aggregation of news and information about Subversion