CINXE.COM
Apache Subversion Features
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>Apache Subversion Features</title> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="manifest" href="/site.webmanifest"> <link rel="apple-touch-icon" href="/icon.png"> <link rel="icon" type="image/png" href="/icon.png"> <link rel="stylesheet" href="/style/site.css" type="text/css" media="all"> <meta name="theme-color" content="#98b0d4"> </head> <body> <div id="site-banner"> <div style="font-style: italic; text-align: center;" id="site-banner-apachelogo"> <a href="https://www.apache.org/" ><img src="/images/asf_logo_wide.svg" alt="Apache Software Foundation" /></a> </div> <a href="/"> <img src="/images/svn-name-banner.svg" width="379" height="80" alt="[S] Subversion" id="site-banner-svnlogo" /></a> </div> <!-- #site-banner --> <div id="site-nav"> <label for="hamburger">☰</label> <input type="checkbox" id="hamburger"/> <nav id="site-nav-menu"> <p>About Subversion <ul> <li><a href="/news.html">News</a></li> <li><a href="/features.html">Features</a></li> <li><a href="/docs/">Documentation</a></li> <li><a href="/faq.html">FAQ</a></li> <li><a href="/roadmap.html">Roadmap</a></li> <li><a href="/security/">Security</a></li> <li><a href="/quick-start">Quick Start</a></li> <li><a href="/blog/">Blog</a></li> </ul> </p> <p>Getting Subversion <ul> <li><a href="/packages.html">Binary Packages</a></li> <li><a href="/download.cgi">Source Download</a></li> <li><a href="/docs/release-notes/">Release Notes</a></li> </ul> </p> <p>Community <ul> <li><a href="/mailing-lists.html">Mailing Lists</a></li> <li><a href="/reporting-issues.html">Reporting Issues</a></li> <li><a href="https://cwiki.apache.org/confluence/display/SVN/">Wiki</a></li> <li><a href="/contributing.html">Getting Involved</a></li> <li><a href="/source-code.html">Source Code</a></li> </ul> </p> <p>About the <acronym title="Apache Software Foundation">ASF</acronym> <ul> <li><a class="linkaway" href="https://www.apache.org/licenses/">License</a></li> <li><a class="linkaway" href="https://www.apache.org/foundation/sponsorship.html">Donate</a></li> <li><a class="linkaway" href="https://www.apache.org/foundation/thanks.html">Thanks</a></li> </ul> </p> <p id="site-search"> <form action="https://www.google.com/search" method="get" style="margin-top: 10px; margin-bottom: 10px; display: inline;"> <div style="display: inline;"> <input value="subversion.apache.org" name="sitesearch" type="hidden" /> <input name="q" id="query" type="text" placeholder="Search..." style="width: 10em" /> <input name="Search" value="Go" type="submit"/> </div> </form> </p> <!-- #site-search --> <p id="site-apachecon-block"> <p><a href="https://www.apache.org/events/current-event.html" ><img src="https://www.apache.org/events/current-event-125x125.png" alt="ApacheCon" /></a></p> </p> <!-- #site-apachecon-block --> <p id="site-svnbook-block"> <p>Read the official Subversion documentation <a href="https://svnbook.red-bean.com/" class="linkaway nopadding">online</a>!</p> <p><a href="https://svnbook.red-bean.com/" ><img src="/images/svnbook-cover.jpg" alt="Version Control With Subversion"/></a></p> </p> <!-- #site-svnbook-block --> <p id="copyright"> <p>Copyright © 2023 <a href="https://www.apache.org/" class="nopadding">The Apache Software Foundation</a>, Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0" class="nopadding">Apache License, Version 2.0</a>. Apache, Apache Subversion, and the Apache feather logo are trademarks of The Apache Software Foundation. Subversion and the Apache Subversion logo are registered trademarks of The Apache Software Foundation.</p> <p><a href="https://privacy.apache.org/policies/privacy-policy-public.html" class="nopadding">Privacy policy</a></p> </p> <!-- #copyright --> </nav> </div> <!-- #site-nav --> <div id="site-content"> <div id="site-notice"> <!-- PUT SITE-WIDE NOTICES HERE AS NECESSARY --> </div> <!-- #site-notice --> <!-- **************** BEGIN CONTENT ***************** --> <h1>Apache Subversion Features</h1> <p>Apache Subversion is a full-featured version control system originally designed to be a better <a href="https://en.wikipedia.org/wiki/Concurrent_Versions_System" >CVS</a>. Subversion has since expanded beyond its original goal of replacing CVS, but its basic model, design, and interface remain heavily influenced by that goal. Even today, Subversion should still feel very familiar to CVS users.</p> <p>The following list of features is presented with the assumption that you, the reader, have a basic understanding of what version control is and how version control systems work in general. If there's a feature that you're looking for that is <em>not</em> represented in this list, feel free to ask about it on our <a href="mailing-lists.html">project mailing lists</a> — perhaps we just didn't think to list it here. If Subversion truly lacks a feature you need, your feedback will help us to improve Subversion, and in the meantime, perhaps we can help you meet your need with the features that Subversion does have.</p> <ul> <li id="cvs-features"> <strong>Most CVS features. <a class="sectionlink" href="#cvs-features" title="Link to this section">¶</a> </strong> <p>CVS is a relatively basic version control system. For the most part, Subversion has matched or exceeded CVS's feature set where those features continue to apply in Subversion's particular design.</p> </li> <li id="directory-versioning"> <strong>Directories are versioned. <a class="sectionlink" href="#directory-versioning" title="Link to this section">¶</a> </strong> <p>Subversion versions directories as first-class objects, just like files.</p> </li> <li id="action-versioning"> <strong>Copying, deleting, and renaming are versioned. <a class="sectionlink" href="#action-versioning" title="Link to this section">¶</a> </strong> <p>Copying and deleting are versioned operations. Renaming is also a versioned operation, albeit with some <a href="https://issues.apache.org/jira/browse/SVN-898" >quirks</a>.</p> </li> <li id="properties"> <strong>Free-form versioned metadata ("properties"). <a class="sectionlink" href="#properties" title="Link to this section">¶</a> </strong> <p>Subversion allows arbitrary metadata ("properties") to be attached to any file or directory. These properties are key/value pairs, and are versioned just like the objects they are attached to. Subversion also provides a way to attach arbitrary key/value properties to a revision (that is, to a committed changeset). These properties are not versioned, since they attach metadata to the version-space itself, but they can be changed at any time.</p> </li> <li id="atomic-commits"> <strong>Atomic commits. <a class="sectionlink" href="#atomic-commits" title="Link to this section">¶</a> </strong> <p>No part of a commit takes effect until the entire commit has succeeded. Revision numbers are per-commit, not per-file, and commit's log message is attached to its revision, not stored redundantly in all the files affected by that commit.</p> </li> <li id="cheap-copies"> <strong>Branching and tagging are cheap (constant time) operations. <a class="sectionlink" href="#cheap-copies" title="Link to this section">¶</a> </strong> <p>There is no reason for these operations to be expensive, so they aren't.</p> <p>Branches and tags are both implemented in terms of an underlying "copy" operation. A copy takes up a small, constant amount of space. Any copy is a tag; and if you start committing on a copy, then it's a branch as well. (This does away with CVS's "branch-point tagging", by removing the distinction that made branch-point tags necessary in the first place.)</p> </li> <li id="merge-tracking"> <strong>Merge tracking. <a class="sectionlink" href="#merge-tracking" title="Link to this section">¶</a> </strong> <p>Subversion 1.5 introduces merge tracking: automated assistance with managing the flow of changes between lines of development, and with the merging of branches back into their sources. The 1.5 release of merge tracking has basic support for common scenarios; we will be extending the feature in upcoming releases.</p> </li> <li id="file-locking"> <strong>File locking. <a class="sectionlink" href="#file-locking" title="Link to this section">¶</a> </strong> <p>Subversion supports (but does not require) locking files so that users can be warned when multiple people try to edit the same file. A file can be marked as requiring a lock before being edited, in which case Subversion will present the file in read-only mode until a lock is acquired.</p> </li> <li id="symbolic-links"> <strong>Symbolic links can be versioned. <a class="sectionlink" href="#symbolic-links" title="Link to this section">¶</a> </strong> <p>Unix users can place symbolic links under version control. The links are recreated in Unix working copies, but not in win32 working copies.</p> </li> <li id="execute-flag"> <strong>Executable flag is preserved. <a class="sectionlink" href="#execute-flag" title="Link to this section">¶</a> </strong> <p>Subversion notices when a file is executable, and if that file is placed into version control, its executability will be preserved when it it checked out to other locations. (The mechanism Subversion uses to remember this is simply <a href="#properties" >versioned properties</a>, so executability can be manually edited when necessary, even from a client that does not acknowledge the file's executability, e.g., when having the wrong extension under Microsoft Windows).</p> </li> <li id="apache-httpd-server"> <strong>Apache network server option, with WebDAV/DeltaV protocol. <a class="sectionlink" href="#apache-httpd-server" title="Link to this section">¶</a> </strong> <p>Subversion can use the HTTP-based WebDAV/DeltaV protocol for network communications, and the Apache web server to provide repository-side network service. This gives Subversion an advantage over CVS in interoperability, and allows certain features (such as authentication, wire compression) to be provided in a way that is already familiar to administrators</p> </li> <li id="svnserve"> <strong>Standalone server option (<tt>svnserve</tt>). <a class="sectionlink" href="#svnserve" title="Link to this section">¶</a> </strong> <p>Subversion offers a standalone server option using a custom protocol, since not everyone wants to run an Apache HTTPD server. The standalone server can run as an inetd service or in daemon mode, and offers the same level of authentication and authorization functionality as the HTTPD-based server. The standalone server can also be tunnelled over ssh.</p> </li> <li id="parseable-output"> <strong>Parseable output. <a class="sectionlink" href="#parseable-output" title="Link to this section">¶</a> </strong> <p>All output of the Subversion command-line client is carefully designed to be both human readable and automatically parseable; scriptability is a high priority.</p> </li> <li id="localization"> <strong>Localized messages. <a class="sectionlink" href="#localization" title="Link to this section">¶</a> </strong> <p>Subversion uses gettext() to display translated error, informational, and help messages, based on current locale settings.</p> </li> <li id="interactive-conflict-resolution"> <strong>Interactive conflict resolution. <a class="sectionlink" href="#interactive-conflict-resolution" title="Link to this section">¶</a> </strong> <p>The Subversion command-line client (<tt>svn</tt>) offers various ways to resolve conflicting changes, include interactive resolution prompting. This mechanism is also made available via APIs, so that other clients (such as graphical clients) can offer interactive conflict resolution appropriate to their interfaces.</p> </li> <li id="read-only-mirroring"> <strong>Repository read-only mirroring. <a class="sectionlink" href="#read-only-mirroring" title="Link to this section">¶</a> </strong> <p>Subversion supplies a utility, <tt>svnsync</tt> for synchronizing (via either push or pull) a read-only slave repository with a master repository.</p> </li> <li id="write-through-proxy"> <strong>Write-through proxy over WebDAV. <a class="sectionlink" href="#write-through-proxy" title="Link to this section">¶</a> </strong> <p>Subversion 1.5 introduces a write-through proxy feature that allows slave repositories (see <a href="#read-only-mirroring" >read-only mirroring</a>) to handle all read operations themselves while passing write operations through to the master. This feature is only available with the Apache HTTPD (WebDAV) server option.</p> </li> <li id="modular-design"> <strong>Natively client/server, layered library design with clean APIs. <a class="sectionlink" href="#modular-design" title="Link to this section">¶</a> </strong> <p> Subversion is designed to be client/server from the beginning; thus avoiding some of the maintenance problems which have plagued CVS. The code is structured as a set of modules with well-defined interfaces, designed to be called by other applications.</p> </li> <li id="binary-files"> <strong>Binary files handled efficiently. <a class="sectionlink" href="#binary-files" title="Link to this section">¶</a> </strong> <p>Subversion is equally efficient on binary as on text files, because it uses a binary diffing algorithm to transmit and store successive revisions.</p> </li> <li id="proportionality"> <strong>Costs are proportional to change size, not data size. <a class="sectionlink" href="#proportionality" title="Link to this section">¶</a> </strong> <p>In general, the time required for a Subversion operation is proportional to the size of the <em>changes</em> resulting from that operation, not to the absolute size of the project in which the changes are taking place.</p> </li> <li id="bindings"> <strong>Bindings to programming languages. <a class="sectionlink" href="#bindings" title="Link to this section">¶</a> </strong> <p>The Subversion APIs come with bindings for many programming languages, such as Python, Perl, Java, and Ruby. (Subversion itself is written in C.)</p> </li> <li id="changelists"> <strong>Changelists. <a class="sectionlink" href="#changelists" title="Link to this section">¶</a> </strong> <p>Subversion 1.5 introduces changelists, which allows a user to put modified files into named groups on the client side, and then commit by specifying a particular group. For those who work on logically separate changesets simultaneously in the same directory tree, changelists can help keep things organized.</p> </li> <li id="more"> <strong>And more... <a class="sectionlink" href="#more" title="Link to this section">¶</a> </strong> <p>...even when we manage to keep this list up-to-date, it isn't possible to list every little feature. See the <a href="docs/" >documentation</a> for more information.</p> </li> </ul> <!-- ***************** END CONTENT ****************** --> </div> <!-- #site-content --> </body> </html>