Original author(s) | CollabNet |
---|---|
Developer(s) | Apache Software Foundation |
Initial release | 20 October 2000 |
Stable release(s) | |
Repository | |
Written in | C |
Operating system | |
Type | Revision control |
License | Apache-2.0 [lower-alpha 1] |
Website | subversion |
Apache Subversion (often abbreviated SVN, after its command name svn) is a version control system distributed as open source under the Apache License. [2] Software developers use Subversion to maintain current and historical versions of files such as source code, web pages, and documentation. Its goal is to be a mostly compatible successor to the widely used Concurrent Versions System (CVS).
The open source community has used Subversion widely: for example, in projects such as Apache Software Foundation, FreeBSD, SourceForge, and from 2006 to 2019, GCC. CodePlex was previously a common host for Subversion repositories.
Subversion was created by CollabNet Inc. in 2000, and is now a top-level Apache project being built and used by a global community of contributors. [3]
CollabNet founded the Subversion project in 2000 as an effort to write an open-source version-control system which operated much like CVS but which fixed the bugs and supplied some features missing in CVS. [4] By 2001, Subversion had advanced sufficiently to host its own source code, [4] and in February 2004, version 1.0 was released. [5] In November 2009, Subversion was accepted into Apache Incubator: this marked the beginning of the process to become a standard top-level Apache project. [6] It became a top-level Apache project on February 17, 2010. [7]
Version | Original release date | Latest version | Latest release date | Status |
---|---|---|---|---|
1.0 | 2004-02-23 | 1.0.9 | 2004-10-13 | No longer supported |
1.1 | 2004-09-29 [8] | 1.1.4 | 2005-04-01 | No longer supported |
1.2 | 2005-05-21 [9] | 1.2.3 | 2005-08-19 | No longer supported |
1.3 | 2005-12-30 [10] | 1.3.2 | 2006-05-23 | No longer supported |
1.4 | 2006-09-10 [11] | 1.4.6 | 2007-12-21 | No longer supported |
1.5 | 2008-06-19 [12] | 1.5.9 | 2010-12-06 | No longer supported |
1.6 | 2009-03-20 [13] | 1.6.23 | 2013-05-30 | No longer supported |
1.7 | 2011-10-11 [14] | 1.7.22 | 2015-08-12 | No longer supported |
1.8 | 2013-06-18 [15] | 1.8.19 | 2017-08-10 | No longer supported |
1.9 | 2015-08-05 [16] | 1.9.12 | 2019-07-24 | No longer supported |
1.10 | 2018-04-13 [17] | 1.10.8 | 2022-04-12 | No longer supported |
1.11 | 2018-10-30 [18] | 1.11.1 | 2019-01-11 | No longer supported |
1.12 | 2019-04-24 [19] | 1.12.2 | 2019-07-24 | No longer supported |
1.13 | 2019-10-30 [20] | 1.13.0 | 2019-10-30 | No longer supported |
1.14 | 2020-05-27 [21] | 1.14.3 | 2023-12-20 | Fully supported, LTS |
1.15 | 2024-0x | 1.15.0 | (Not yet released) | In development |
Legend: Old version Older version, still maintained Latest version Latest preview version Future release |
Release dates are extracted from Apache Subversion's CHANGES
file, [22] which records all release history.
Subversion offers two types of repository storage.
The original development of Subversion used the Berkeley DB package. Subversion has some limitations with Berkeley DB usage when a program that accesses the database crashes or terminates forcibly. No data loss or corruption occurs, but the repository remains offline while Berkeley DB replays the journal and cleans up any outstanding locks. The safest way to use Subversion with a Berkeley DB repository involves a single server-process running as one user (instead of through a shared filesystem). [23] The Berkeley DB backend was deprecated in version 1.8. [24]
In 2004, a new storage subsystem was developed and named FSFS. It works faster than the Berkeley DB backend on directories with a large number of files and takes less disk space, due to less logging. [23]
Beginning with Subversion 1.2, FSFS became the default data store for new repositories.
The etymology of "FSFS" is based on Subversion's use of the term "filesystem" for its repository storage system. FSFS stores its contents directly within the operating system's filesystem, rather than a structured system like Berkeley DB. Thus, it is a "[Subversion] FileSystem atop the FileSystem".
A new filesystem, called FSX, is under development to remove some limitations of FSFS. As of Version 1.9, it was not considered production-ready. [25]
Access to Subversion repositories can take place by:
All three means can access both FSFS and Berkeley DB repositories.
Any 1.x version of a client can work with any 1.x server. Newer clients and servers have additional features and performance capabilities, but have fallback support for older clients/servers. [27]
Internally, a Subversion system comprises 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.
One can view the Subversion filesystem as "two-dimensional". [28] Two coordinates are used to unambiguously address filesystem items:
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 system consumes storage space proportional to the number of changes made, not to the number of revisions.
The Subversion filesystem uses transactions to keep changes atomic. A transaction operates on 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 can re-open the transaction and continue using it. Potentially, multiple clients can access the same transaction and work together on an atomic change, though no existing clients expose this capability.
One important feature of the Subversion filesystem is properties: simple name=value pairs of text. Most properties occur on filesystem entries (i.e., files and directories). These are versioned just like other changes to the filesystem. The Subversion client reserves the 'svn:' prefix for built-in properties, but other names can be used to define custom properties.
.cvsignore
file.Subversion also uses properties 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 they can be changed later if allowed by a pre-revprop-change hook. [31]
Subversion uses the inter-file branching model from Perforce [32] to implement branches and tagging. A branch is a separate line of development. [33] Tagging refers to labeling the repository at a certain point in time so that it can be easily found in the future. In Subversion, the only difference between branches and tags is how they are used.
A new branch or tag is set up by using the "svn copy" command, which should be used in place of the native operating system mechanism. The copied directory is linked to the original in the repository to preserve its history, and the copy takes very little extra space in the repository.
All the versions in each branch maintain the history of the file up to the point of the copy, plus any changes made since. One can "merge" changes back into the trunk or between branches.
A known problem in Subversion affects the implementation of the file and directory rename operation. As of 2014 [update] , Subversion implements the renaming of files and directories as a "copy" to the new name followed by a "delete" of the old name. Only the names change, all data relating to the edit history remains the same, and Subversion will still use the old name in older revisions of the "tree". However, Subversion may become confused when a move conflicts with edits made elsewhere, [34] both for regular commits and when merging branches. [35] The Subversion 1.5 release addressed some of these scenarios while others remained problematic. [36] The Subversion 1.8 release addressed some of these problems by making moves a first-class operation on the client, but it is still treated as copy+delete in the repository. [37]
As of 2013 [update] , Subversion lacks some repository-administration and management features. For instance, someone may wish to edit the repository to permanently remove all historical records of certain data. Subversion does not have built-in support to achieve this simply. [38]
Subversion stores additional copies of data on the local machine, which can become an issue with very large projects or files, or if developers work on multiple branches simultaneously. In versions prior to 1.7 these .svn
directories on the client side could become corrupted by ill-advised user activity like global search/replace operations. [39] Starting with version 1.7 Subversion uses a single centralized .svn folder per working area. [40]
Subversion does not store the modification times of files. As such, a file checked out of a Subversion repository will have the 'current' date (instead of the modification time in the repository), and a file checked into the repository will have the date of the check-in (instead of the modification time of the file being checked in). This might not always be what is wanted. [41] To mitigate this, third-party tools exist that allow for preserving modification time and other filesystem meta-data. [42] [43] However, giving checked out files a current date is important as well — this is how tools like make(1) will take notice of a changed file for rebuilding it.
Subversion uses a centralized revision control model. Ben Collins-Sussman, one of the designers of Subversion, believes a centralised model would help prevent "insecure programmers" from hiding their work from other team members during development. [44] Some users of version control systems see the centralised model as detrimental; famously, Linus Torvalds attacked Subversion's model and its developers. [45]
Subversion often does not deal well with the filename normalization performed by the HFS+ filesystem. This can cause problems when files with accented characters in their names are added to the repository on a non-HFS+ filesystem and the repository is then used with HFS+. [46]
Revision numbers are difficult to remember in any version-control system. For this reason, most systems offer symbolic tags as user-friendly references to them. Subversion does not have such a feature and what its documentation recommends to use instead is very different in nature. Instead of implementing tags as references to points in history, Subversion recommends making snapshot copies into a well-known subdirectory ("tags/
") in the space of the repository tree. Only a few predefined references are available: HEAD
, BASE
, PREV
and COMMITTED
.
This history-to-space projection has multiple issues:
svn diff -r tag1:tag2 myfile
does not work; it is slightly more complicated than that to achieve, requiring the user to know and input URL/paths to the snapshots instead of just the names: svn diff <URL-TO-TAG1>/myfile <URL-TO-TAG2>/myfile
. Other operations like for instance svn log -r tag1:tag2 myfile
are just impossible.tags/
subdirectory: trunk/ /componentfoo/ /componentbar/ tags/ /1.1/ /componentfoo/ /componentbar/ | or | componentfoo/ /trunk/ /tags/ /1.1/ componentbar/ /trunk/ /tags/ /1.1/ |
To address such issues, posters on the Subversion mailing lists have suggested a new feature called "labels" or "aliases". [47] SVN labels would more closely resemble the "tags" of other systems such as CVS or Git. The fact that Subversion has global revision numbers opens the way to a very simple label → revision implementation. Yet as of 2013, no progress has been made and symbolic tags are not in the list of the most wanted features. [48]
CollabNet has continued its involvement with Subversion, but the project runs as an independent open source community. In November 2009, the project was accepted into the Apache Incubator, aiming to become part of the Apache Software Foundation's efforts. [49] Since March 2010, the project is formally known as Apache Subversion, being a part of the Apache Top-Level Projects. [50]
In October 2009, WANdisco announced the hiring of core Subversion committers as the company moved to become a major corporate sponsor of the project. This included Hyrum Wright, president of the Subversion Corporation and release manager for the Subversion project since early 2008, who joined the company to lead its open source team. [51]
The Subversion open-source community does not provide binaries, but potential users can download binaries from volunteers. [52] While the Subversion project does not include an official graphical user interface (GUI) for use with Subversion, third parties have developed a number of different GUIs, along with a wide variety of additional ancillary software.
Work announced in 2009 included SubversionJ (a Java API) and implementation of the Obliterate command, similar to that provided by Perforce. Both of these enhancements were sponsored by WANdisco. [53]
The Subversion committers normally have at least one or two new features under active development at any one time. The 1.7 release of Subversion in October 2011 included a streamlined HTTP transport to improve performance and a rewritten working-copy library. [54]
In 2002, a design contest was held to select the logo for Subversion. The original entries can be found here as well as the votes for each logo. The current logo received the most votes in the contest.
Concurrent Versions System is a version control system originally developed by Dick Grune in July 1986.
Version control is the software engineering practice of controlling computer files and versions of files; primarily source code text files, but generally any type of file.
Revision Control System (RCS) is an early implementation of a version control system (VCS). It is a set of UNIX commands that allow multiple users to develop and maintain program code or documents. With RCS, users can make their own revisions of a document, commit changes, and merge them. RCS was originally developed for programs but is also useful for text documents or configuration files that are frequently revised.
IBM DevOps Code ClearCase (also known as IBM Rational ClearCase) is a family of computer software tools that supports software configuration management (SCM) of source code and other software development assets. It also supports design-data management of electronic design artifacts, thus enabling hardware and software co-development. ClearCase includes revision control and forms the basis for configuration management at large and medium-sized businesses, accommodating projects with hundreds or thousands of developers. It is developed by IBM.
Trac is an open-source, web-based project management and bug tracking system. It has been adopted by a variety of organizations for use as a bug tracking system for both free and open-source software and proprietary projects and products. Trac integrates with major version control systems including Subversion and Git. Trac is used, among others, by the Internet Research Task Force, Django, FFmpeg, jQuery UI, WebKit, 0 A.D., and WordPress.
GNU arch software is a distributed revision control system that is part of the GNU Project and licensed under the GNU General Public License. It is used to keep track of the changes made to a source tree and to help programmers combine and otherwise manipulate changes made by multiple people or at different times.
A versioning file system is any computer file system which allows a computer file to exist in several versions at the same time. Thus it is a form of revision control. Most common versioning file systems keep a number of old copies of the file. Some limit the number of changes per minute or per hour to avoid storing large numbers of trivial changes. Others instead take periodic snapshots whose contents can be accessed using methods similar as those for normal file access.
Git is a distributed version control system that tracks versions of files. It is often used to control source code by programmers collaboratively developing software.
Mantis Bug Tracker is a free and open source, web-based bug tracking system. The most common use of MantisBT is to track software defects. However, MantisBT is often configured by users to serve as a more generic issue tracking system and project management tool.
ViewVC is an open-source tool for viewing the contents of CVS and SVN repositories using a web browser. It allows looking at specific revisions of files as well as side-by-side diffs of different revisions. It is written in Python and the view parameters can be modified directly in a URL using a REST style interface.
Sun WorkShop TeamWare is a distributed source code revision control system made by Sun Microsystems. It was first announced in November 1992 as SPARCworks/TeamWare and ProWorks/TeamWare and made commercially available in 1993. Last available as part of the Forte Developer 6 update 2 product, TeamWare is no longer being offered for sale, and is not part of the Sun Studio product.
CVSNT is a version control system compatible with and originally based on Concurrent Versions System (CVS), but whereas that was popular in the open-source world, CVSNT included features designed for developers working on commercial software including support for Windows, Active Directory authentication, reserved branches/locking, per-file access control lists and Unicode filenames. Also included in CVSNT were various RCS tools updated to work with more recent compilers and compatible with CVSNT.
TortoiseSVN is a Subversion client, implemented as a Microsoft Windows shell extension, that helps programmers manage different versions of the source code for their programs. It is free software released under the GNU General Public License.
The following tables describe attributes of notable version control and software configuration management (SCM) software systems that can be used to compare and contrast the various systems.
A comparison of Subversion clients includes various aspects of computer software implementations of the client role using the client–server model of the Subversion revision control system.
SVNKit is an open-source, pure Java software library for working with the Subversion version control system. It is free to use on opensource projects but requires that you buy a commercial license to use to develop with proprietary software. It implements virtually all Subversion features and provides API to work with Subversion working copies, access and manipulate Subversion repositories.
In version control systems, a repository is a data structure that stores metadata for a set of files or directory structure. Depending on whether the version control system in use is distributed, like Git or Mercurial, or centralized, like Subversion, CVS, or Perforce, the whole set of information in the repository may be duplicated on every user's system or may be maintained on a single server. Some of the metadata that a repository contains includes, among other things, a historical record of changes in the repository, a set of commit objects, and a set of references to commit objects, called heads.
VisualSVN Server is a freeware Apache Subversion server package for Windows. The package is designed and implemented to provide Subversion version control as a first class citizen application in an Active Directory environment. VisualSVN Server is a standalone product which installs in a couple of clicks and works out of the box. The paid Enterprise Edition of VisualSVN Server provides tighter integration with Active Directory environment and Multisite Repository Replication feature.