features.html   [plain text]


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css"> /* <![CDATA[ */
  @import "branding/css/tigris.css";
  @import "branding/css/inst.css";
  /* ]]> */</style>
<link rel="stylesheet" type="text/css" media="print"
  href="branding/css/print.css"/>
<script type="text/javascript" src="branding/scripts/tigris.js"></script>
<title>Subversion Features</title>
<!-- Custom stylations to hide the obnoxious project info -->
<style type="text/css">
#projecthome .axial { display: none; }
#apphead h1 { display: none; }
#longdescription { border: none; }
#longdescription h2 { display: none; }
#customcontent h2 { display: block; }
</style>
<!-- End custom stylations -->
</head>

<body>

<div id="features">
<h2>Subversion's Features</h2>

<p></p>


<ul>

<li id="cvs-features" title="cvs-features">
    <strong>Most CVS features.</strong> <p>Subversion was originally
    designed to be a better <a
    href="http://en.wikipedia.org/wiki/Concurrent_Versions_System"
    >CVS</a>, so it has most of CVS's features.  Generally,
    Subversion's interface to a particular feature is similar to
    CVS's, except where there's a compelling reason to do
    otherwise.</p>

    <p>Subversion has since expanded beyond its original goal of
    replacing CVS, but its history influenced its feature and
    interface choices; Subversion today should still feel very
    familiar to CVS users.</p>
</li>

<li id="directory-versioning" title="directory-versioning">
    <strong>Directories are versioned.</strong>
    <p>Subversion versions directories as first-class objects, just
    like files.</p>
</li>

<li id="action-versioning" title="action-versioning">
    <strong>Copying, deleting, and renaming are versioned.</strong>
    <p>Copying and deleting are versioned operations.  Renaming is
    also a versioned operation, albeit with some <a
    href="http://subversion.tigris.org/issues/show_bug.cgi?id=898"
    >quirks</a>.</p> 
</li>

<li id="properties" title="properties">
    <strong>Free-form versioned metadata ("properties").</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" title="atomic-commits">
    <strong>Atomic commits.</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" title="cheap-copies">
    <strong>Branching and tagging are cheap
            (constant time) operations.</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" title="merge-tracking">
    <strong>Merge tracking.</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" title="file-locking">
    <strong>File locking.</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" title="symbolic-links">
    <strong>Symbolic links can be versioned.</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" title="execute-flag">
    <strong>Executable flag is preserved.</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" title="apache-httpd-server">
    <strong>Apache network server option, with WebDAV/DeltaV
    protocol.</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" title="svnserve">
    <strong>Standalone server option (<tt>svnserve</tt>).</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" title="parseable-output">
    <strong>Parseable output.</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" title="localization">
    <strong>Localized messages.</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" title="interactive-conflict-resolution">
    <strong>Interactive conflict resolution.</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" title="read-only-mirroring">
    <strong>Repository read-only mirroring.</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" title="write-through-proxy">
    <strong>Write-through proxy over WebDAV.</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" title="modular-design">
    <strong>Natively client/server, layered library design with
            clean APIs.</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" title="binary-files">
    <strong>Binary files handled efficiently.</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" title="proportionality">
    <strong>Costs are proportional to change size, not data size.</strong>
    <p>In general, the time required for a Subversion operation is
    proportional to the size of the <i>changes</i> resulting from that
    operation, not to the absolute size of the project in which the
    changes are taking place.</p>
</li>

<li id="bindings" title="bindings">
    <strong>Bindings to programming languages.</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" title="changelists">
    <strong>Changelists.</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" title="more">
    <strong>And more...</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="index.html#help" >documentation</a> for more information.</p>
</li>

</ul>
</div>  <!-- features -->

</body>
</html>