blob: 0bd1a55dbf4c90ab6a62eb2e6c2e0b0b66f29a0e [file] [log] [blame]
<h1>Subversion FAQ</h1>
<p>
<![CDATA[ Table of Contents ]]>
<ol>
<p>
<strong>General questions:</strong>
</p>
<li><a href="#why">Why does this project exist?</a></li>
<li><a href="#collab">Is Subversion proprietary? I heard that it
belongs to CollabNet.</a></li>
<li><a href="#stable">Is Subversion stable enough for me to use for my
own projects?</a></li>
<li><a href="#interop">What is Subversion's client/server interoperability
policy?</a></li>
<li><a href="#portability">What operating systems does Subversion run
on?</a></li>
<li><a href="#filesystem">What's all this about a new filesystem? Is
it like ext2?</a></li>
<li><a href="#apache-extension">I heard that Subversion is an Apache
extension? What does it use for servers?</a></li>
<li><a href="#need-apache">Does this mean I have to set up Apache to
use Subversion?</a></li>
<li><a href="#multiple-apachim">I run Apache 1.x right now, and can't
switch to Apache 2.0 just to serve Subversion repositories.
Does that mean I can't run a Subversion server?</a></li>
<li><a href="#feature-x">Why don't you do X, just like SCM system Y?</a></li>
<li><a href="#globalrev">Why does the entire repository share the
same revision number? I want each of my projects to have their
own revision numbers. </a></li>
<li><a href="#changesets">Does Subversion have changesets?</li>
<li><a href="#release">When's the next release?</a></li>
<li><a href="#symlinks">Does Subversion support symlinks?</a></li>
<li><a href="#logo">I need a high resolution version of the Subversion logo,
where can I get it?</a></li>
<li><a href="#more-information">I have other questions. Where can I
get more information?</a></li>
<p>
<strong>How-to:</strong>
</p>
<li><a href="#co-svn">How do I check out the Subversion code?</a></li>
<li><a href="#repository">How do I create a repository? How do I
import data into it?</a></li>
<li><a href="#cvs2svn">How do I convert an existing CVS repository
into a Subversion repository?</a></li>
<li><a href="#proxy">What if I'm behind a proxy?</a></li>
<li><a href="#paranoid">My admins don't want me to have a HTTP server for
Subversion. What can I do if I still want remote usage?</a></li>
<li><a href="#multi-proj">How do I manage several different projects
under Subversion?</a></li>
<li><a href="#multi-merge">How do I merge two completely separate repositories?</a></li>
<li><a href="#nfs">Should I store my repository on a NFS server?</a></li>
<li><a href="#bdblogs">Why is my repository taking up so much disk space?</a></li>
<li><a href="#reposperms">How do I set repository permissions correctly?</a></li>
<li><a href="#readonly">Why do read-only operations still need repository write access?</a></li>
<li><a href="#removal">How do I completely remove a file from the repository's history?</a></li>
<li><a href="#change-log-msg">How do I change the log message for a revision
after it's been committed?</a></li>
<li><a href="#patch">How do I submit a patch for Subversion?</a></li>
<li><a href="#in-place-import">How can I do an in-place 'import'
(i.e. add a tree to subversion without moving or deleting the
original working copy)?</a></li>
<li><a href="#dumpload">What is this "dump/load cycle" people
sometimes talk about when upgrading a Subversion server?</a></li>
<li><a href="#sspi">How do I allow clients to authenticate against a
Windows domain controller using SSPI Authentication?</a></li>
<li><a href="#adm-dir">I don't like the ".svn" directory name, and
prefer "SVN" or something else. How do I change it?</a></li>
<li><a href="#case-change">I checked in a file but had the wrong case
in the filename. How do I change it?</a></li>
<li><a href="#merge-using-tags">I can't use tags to merge changes from a
branch into the trunk like I used to with CVS, can I?</a></li>
<li><a href="#version-value-in-source">Why doesn't the $Revision$
keyword do what I want? It expands to the file's last-changed revision,
but I want something that will expand to the file's current revision.</a></li>
<p>
<strong>Troubleshooting:</strong>
</p>
<li><a href="#permissions">My repository seems to get stuck all the
time, giving me errors about needing recovery
(DB_RUNRECOVERY). What could be the cause?</a></li>
<li><a href="#wedged-repos">Every time I try to access
my repository, the process just hangs. Is my repository
corrupt?</a></li>
<li><a href="#wedged-wc">Every time I try to run a svn
command, it says my working copy is locked. Is my working copy
corrupt?</a></li>
<li><a href="#wc-out-of-date">I'm trying to commit, but Subversion says my
working copy is out of date?</a></li>
<li><a href="#unrecognized-url-error">I just built the distribution
binary, and when I try to check out Subversion, I get an error
about an "Unrecognized URL scheme." What's up with that?</a></li>
<li><a href="#db-recover">I'm getting errors finding or opening a repository,
but I know my repository URL is correct. What's wrong?</a></li>
<li><a href="#configure-sed-error">When I run `<tt>configure</tt>', I
get errors <tt>subs-1.sed&nbsp;line&nbsp;38:&nbsp;Unterminated&nbsp;`s'&nbsp;command</tt>. What's wrong?</a></li>
<li><a href="#linux-bdb42-build">I'm having trouble building
Subversion under *NIX with BerkeleyDB 4.2 What should I do?</a></li>
<li><a href="#windows-msvc-build">I'm having trouble building
Subversion under Windows with MSVC++ 6.0. What should I do?</a></li>
<li><a href="#windows-drive-letter">How can I specify a Windows drive letter in
a <tt>file:</tt> URL?</a></li>
<li><a href="#write-over-dav">I'm having trouble doing write
operations to a Subversion repository over a network.</a></li>
<li><a href="#windows-xp-server">Under Windows XP, the Subversion
server sometimes seems to send out corrupted data. Can this really be
happening?</a></li>
<li><a href="#ethereal">What is the best method of doing a network
trace of the conversation between a Subversion client and server?</a></li>
<li><a href="#revert">Why does the <tt>svn revert</tt> require an
explicit target? Why is it not recursive by default? These
behaviors differ from almost all the other subcommands.</a></li>
<li><a href="#db3db4">When I start Apache, mod_dav_svn complains about
a "bad database version", that it found db-3.X, rather than
db-4.X.</a></li>
<li><a href="#redhat-db">I'm getting "Function not implemented" errors on
RedHat 9, and nothing works. How do I fix this?</a></li>
<li><a href="#no-author">Why does SVN log say "(no author)" for files
committed or imported via Apache (ra_dav)?</a></li>
<li><a href="#windows-access-denied">I'm getting occasional "Access Denied"
errors on Windows. They seem to happen at random. Why?</a></li>
<li><a href="#freebsd-hang">On FreeBSD, certain operations (especially
svnadmin create) sometimes hang. Why?</a></li>
<li><a href="#301-error">I can see my repository in a web browser, but
'svn checkout' gives me an error about "301 Moved Permanently".
What's wrong?</a></li>
<li><a href="#no-copy-history">I'm trying to look at an old version of my
file, but svn says something about "path not found". What's going
on?</a></li>
<li><a href="#digest-auth">Why doesn't HTTP Digest auth work?</a></li>
<li><a href="#xlc-compile">Compiling with xlc on AIX, I get compilation
errors. What's wrong?</a></li>
<li><a href="#nonrecursive-checkout">I checked out a directory
non-recursively (with -N), and now I want to make certain
subdirectories "appear". But <tt>svn up subdir</tt> doesn't
work.</a></li>
<li><a href="#mod_dav_svn-win32">I am trying to use mod_dav_svn
with Apache on Win32 and I'm getting an error saying that the
module cannot be found, yet the mod_dav_svn.so file is right
there in <tt>\Apache\modules.</tt></li>
<p>
<strong>Developer questions:</strong>
</p>
<li><a href="#ramdisk-tests">How do I run the regression tests in a
ram disk?</a></li>
<p>
<strong>References:</strong>
</p>
<li><a href="#http-methods">What are all the HTTP methods Subversion
uses?</a></li>
<li><a href="#bikeshed">What's a 'bikeshed'?</a></li>
<li><a href="#baton">What's a 'baton'?</a></li>
</ol>
<![CDATA[=========================================================]]>
<p>
<hr>
<p>
<h2>General questions:</h2>
<p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="why">Why does this project exist?</a></h3>
<p>To take over the CVS user base. Specifically, we're writing a new
version control system that is very similar to CVS, but fixes many
things that are broken. See our front page.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="collab">Is Subversion proprietary? I heard that it
belongs to CollabNet.</a></h3>
<p>No, Subversion is open source / free software. CollabNet pays the
salaries of several full-time developers, and holds the copyright on
the code, but that copyright is <a
href="http://subversion.tigris.org/project_license.html">an
Apache/BSD-style license</a>
which is fully compliant with the <a
href="http://www.debian.org/social_contract#guidelines">Debian Free
Software Guidelines</a>. In other words, you are free to download,
modify, and redistribute Subversion as you please; no permission from
CollabNet or anyone else is required.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="stable">Is Subversion stable enough for me to use for my
own projects?</a></h3>
<p>Yes, absolutely. It's ready for prime-time production.</p>
<p>Subversion has been in development since 2000, and became
self-hosting after one year. A year later when we declared "alpha",
Subversion was already being used by dozens of private developers and
shops for real work. After that, it was two more years of bugfixing
and stabilization until we reached 1.0. Most other projects probably
would have called the product "1.0" much earlier, but we deliberately
decided to delay that label as long as possible. We were aware that
many people were waiting for a 1.0 before using Subversion, and had
very specific expectations about the meaning of that label. So we
stuck to that same standard.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="interop">What is Subversion's client/server
interoperability policy?</a></h3>
<p>For pre-1.0 releases of Subversion (which you shouldn't be using
anymore!), the client and server are designed to work as long as they
aren't more than one major release version apart. (For example, a
0.25.X client will talk to a 0.24.X or 0.26.X server.)</p>
<p>Now that Subversion is beyond the 1.0 milestone, client/server
interoperability policy is documented in the "Compatibility" section
of the <a
href="http://svn.collab.net/repos/svn/trunk/HACKING">HACKING
file</a>.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="portability">What operating systems does Subversion run
on?</a></h3>
<p>All modern flavors of Unix, Win32, BeOS, OS/2, MacOS X.</p>
<p>Subversion is written in ANSI C and uses APR, the <a
href="http://apr.apache.org">Apache Portable Runtime</a> library, as a
portability layer. The Subversion client will run anywhere APR runs,
which is most places. The Subversion server (i.e., the repository
side) is the same, except that it will not work on Win9x platforms
(Win95/Win98/WinME), because it depends on <a
href="http://www.sleepycat.com">Berkeley DB</a>, which has
shared-memory segment problems on Win9x.</p>
<p>To reiterate, a Subversion server can be run on all platforms
except Win95/Win98/WinMe. The Subversion client can be used on any
platform where APR runs.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="filesystem">What's all this about a new filesystem? Is
it like ext2?</a></h3>
<p>No. The "Subversion Filesystem" is not a kernel-level filesystem that
one would install in an operating system. Instead, it refers to the
design of Subversion's repository. The repository is built on a
database (currently <a href="http://www.sleepycat.com">Berkeley
DB</a>) and exports a C API that <i>simulates</i> a filesystem -- a
versioned filesystem. Thus writing a program to access the repository
is like writing against other filesystem APIs. The main difference is
that this particular filesystem doesn't lose data when written to; old
versions of files and directories are saved.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="apache-extension">I heard that Subversion is an Apache
extension? What does it use for servers?</a></h3>
<p>No. Subversion is a set of libraries. It comes with a
command-line client that uses them. There are two different
Subversion server processes: either <b>svnserve</b>, which is small
standalone program similar to cvs pserver, or Apache <b>httpd-2.0</b>
using a special <b>mod_dav_svn</b> module. <b>svnserve</b> speaks a
custom protocol, while <b>mod_dav_svn</b> uses WebDAV as its network
protocol. See <a
href="http://svnbook.red-bean.com/html-chunk/ch06.html">chapter 6</a>
in the Subversion book to learn more.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="need-apache">Does this mean I have to set up Apache to
use Subversion?</a></h3>
<p>The short answer: no.</p>
<p>The long answer: if you just want to access a repository, then you
only need to build a Subversion client. If you want to <b>host</b> a
networked repository, then you need to set up either Apache2 or an
"svnserve" server.</p>
<p>For more details about setting up a network accessible Subversion
server, see <a
href="http://svnbook.red-bean.com/html-chunk/ch06.html">chapter 6</a>
in the Subversion book.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="multiple-apachim">I run Apache 1.x right now, and can't
switch to Apache 2.0 just to serve Subversion repositories.
Does that mean I can't run a Subversion server?</a></h3>
<p>No, you can run <b>svnserve</b> as a Subversion server. It works
extremely well.</p>
<p>If you want WebDAV and all the other "goodies" that come with the
Apache server, then yes, you'll need Apache 2.0. It's always an
option to run Apache 2.0 on a different port while continuing to run
Apache 1.x on port 80. Different versions of Apache can happily
coexist on the same machine. Just change the <tt>Listen</tt>
directive in httpd.conf from "<tt>Listen&nbsp;80</tt>" to
"<tt>Listen&nbsp;8080</tt>" or whatever port number you want, and make
sure to specify that port when you publish your repository URL (e.g.,
<tt>http://svn.mydomain.com:8080/repos/blah/trunk/</tt>).</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="feature-x">Why don't you do X, just like SCM system Y?</a></h3>
<p>We aren't attempting to break new ground in SCM systems, nor are we
attempting to imitate all the best features of every SCM system out
there. We're trying to replace CVS. See the first question.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="globalrev">Why does the entire repository share the
same revision number? I want each of my projects to have their
own revision numbers.</a></h3>
<p>
The global revision number attached to the repository as a whole is
meaningless from a user's perspective. It's an internal mechanism that
accomplishes the goal of the underlying schema design. It just so
happens to be exposed so that the user's interface can sometimes be a
little more convenient than always having to type obnoxiously long
date/time strings.
</p>
<p>
The revision number is only relevant to the repository, and user
convenience. It has <b>no</b> impact on any other factor of what you
store in the repository. Repository revision number bumps aren't
nearly useful enough to be an accurate indication of the real rate of
change of a given code base. There are other more complicated ways to
get a much better picture of a code-base's rate of change.
</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="changesets">Does Subversion have Changesets?</a></h3>
<p>The question is a bit loaded, because everyone seems to have a
slightly different definition of "changeset", or a least a slightly
different expectation of what it means for a version control system to
have "changeset features".</p>
<p>For the purposes of this discussion, here's a simple definition of
changeset: it's a collection of changes with a unique name. The
changes might include textual edits to file contents, modifications to
tree structure, or tweaks to metadata. In more common speak, a
changeset is just a patch with a name you can refer to.</p>
<p>Subversion manages versioned trees as first order objects (the
repository is an array of trees), and the changesets are things that
are derived (by comparing adjacent trees.) Systems like Arch or
Bitkeeper are built the other way around: they're designed to manage
changesets as first order objects (the repository is a bag of
patches), and trees are derived by composing sets of patches
together.</p>
<p>Neither philosophy is better in absolute terms: the debate goes
back at least 30 years. The two designs are better or worse for
different types of software development. We're not going to discuss
that here. Instead, here's an explanation of what you can do with
Subversion.</p>
<p>In Subversion, a global revision number 'N' names a tree in the
repository: it's the way the repository looked after the Nth commit.
It's also the name of an implicit changeset: if you compare tree N
with tree N-1, you can derive the exact patch that was committed.</p>
<p>For this reason, it's easy to think of "revision N" as not just a
tree, but a changeset as well. If you use an issue tracker to manage
bugs, you can use the revision numbers to refer to particular patches
that fix bugs -- for example, "this issue was fixed by revision 9238."
Somebody can then run 'svn log -r9238' to read about the exact
changeset which fixed the bug, and run 'svn diff -r9237:9238' to see
the patch itself. And svn's merge command also uses revision numbers.
You can merge specific changesets from one branch to another by naming
them in the merge arguments: 'svn merge -r9237:9238 branchURL' would
merge changeset #9238 into your working copy.</p>
<p>This is nowhere near as complicated as a system built around
changesets as primary objects, but it's still a vast convenience over
CVS.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="release">When's the next release?</a></h3>
<p>See our status page, <a
href="http://subversion.tigris.org/project_status.html">
http://subversion.tigris.org/project_status.html</a>.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="symlinks">Does Subversion support symlinks?</a></h3>
<p>Subversion does not currently support symlinks, and there are no
concrete plans to support them. The obstacle has been that symbolic
links are not portable across all the platforms Subversion runs on.
Therefore, any design for symlink support has to account for how the
symlinks will behave in a working copy checked out into an environment
that doesn't support symlinks. If you have a proposal, please share
it with the developers at <a href="mailto:dev@subversion.tigris.org"
>dev@subversion.tigris.org</a>.
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="logo">I need a high resolution version of the Subversion logo,
where can I get it?</a></h3>
<p>Vectorized versions of the Subversion logo are available in the <a
href="http://svn.collab.net/repos/svn/trunk/www">logo directory of the www
tree</a> of the <a href="http://svn.collab.net/repos/svn/trunk">Subversion
repository</a>.</p>
<p>Specifically, an <a
href="http://svn.collab.net/repos/svn/trunk/www/logo/subversion_logo.eps">EPS
version</a>, as well as an <a
href="http://svn.collab.net/repos/svn/trunk/www/logo/subversion_logo.ai">Adobe
Illustrator document</a> are available.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3>I have other questions. Where can I get more<a
name="more-information"> information?</a></h3>
<p>Please send your questions or concerns to the Subversion Users <a
href="mailto:users@subversion.tigris.org">mailing list</a>. Alternatively,
several Subversion users and developers can usually be contacted via IRC on
channel #svn on <a href="http://www.freenode.net">irc.freenode.net</a>.</p>
<![CDATA[=========================================================]]>
<p>
<hr>
<p>
<h2>How-to:</h2>
<p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="co-svn">How do I check out the Subversion code?</a></h3>
<p>Use the subversion client:
<pre>
$ svn co http://svn.collab.net/repos/svn/trunk subversion
</pre>
<p>
That will check out a copy of the Subversion source tree into a
directory named subversion on your local machine.
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="repository">How do I create a repository? How do I
import data into it?</a></h3>
<p>See <a
href="http://svn.collab.net/repos/svn/trunk/README">
http://svn.collab.net/repos/svn/trunk/README</a>; specifically, look
at section IV, the "Quickstart Guide".</p>
<p>For even more detail, read chapter 5 in <a
href="http://svnbook.red-bean.com">The Subversion Book</a>.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="cvs2svn">How do I convert an existing CVS repository
into a Subversion repository?</a></h3>
<p>Members of the Subversion development community created and
maintain a tool called cvs2svn. You can find it at <a
href="http://cvs2svn.tigris.org/">http://cvs2svn.tigris.org/</a>.
Note that it is <b>still under development</b>, so only use it on a
copy of your CVS repository and <b>double check your results</b>. Be
sure to read the <a
href="http://svn.collab.net/repos/cvs2svn/trunk/README">README</a>.
</p>
<p>If cvs2svn.py does not work for you, (e.g. your repository
causes it to crash, or it doesn't deal with branches and tags
quite how you would like), there are at least two other
conversion utilities you can try. These have different features
(and possibly different bugs):</p>
<ul>
<li>One based on <a
href="http://public.perforce.com/public/revml/index.html">VCP</a>
written by Chia-liang Kao can be found <a
href="http://svn.clkao.org/revml/branches/svn-perl/"
>http://svn.clkao.org/revml/branches/svn-perl/</a>.
<br/>
(Documentation at <a
href="http://svn.clkao.org/revml/branches/svn-perl/lib/VCP/Dest/svn.pm"
>http://svn.clkao.org/revml/branches/svn-perl/lib/VCP/Dest/svn.pm</a>.)</li>
<li>refinecvs written by Lev Serebryakov is at <a
href="http://lev.serebryakov.spb.ru/refinecvs/"
>http://lev.serebryakov.spb.ru/refinecvs/</a>.</li>
</ul>
<p>See also the <a href="project_links.html">Subversion links</a>
page.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="proxy">What if I'm behind a proxy?</a></h3>
<p>The Subversion client can go through a proxy, if you configure it
to do so. First, edit your "servers" configuration file
to indicate which proxy to use. The files location depends on your
operating system. On Linux or Unix it is located in the directory
"~/.subversion". On Windows it is in "%APPDATA%\Subversion". (Try
"echo %APPDATA%", note this is a hidden directory.)</p>
<p>There are comments in the file explaining what to do. If you don't
have that file, get the latest Subversion client and run any command;
this will cause the configuration directory and template files to be
created.</p>
<p>Older versions of Subversion, including the 0.14.3 bootstrap
tarball, use the file ~/.subversion/proxies to define the proxy
settings. This file is ignored by the current version of
Subversion.</p>
<p>Next, you need to make sure the proxy server itself supports all
the HTTP methods Subversion uses. Some proxy servers do not support
these methods by default: PROPFIND, REPORT, MERGE, MKACTIVITY,
CHECKOUT. In general, solving this depends on the particular proxy
software. For Squid, the config option is</p>
<pre>
# TAG: extension_methods
# Squid only knows about standardized HTTP request methods.
# You can add up to 20 additional "extension" methods here.
#
#Default:
# none
extension_methods REPORT MERGE MKACTIVITY CHECKOUT
</pre>
<p>(Squid 2.4 and later already knows about PROPFIND.)</p>
<p>See also "<a href="#http-methods">What are all the HTTP methods
Subversion uses?</a>" for advice on additional HTTP methods to allow
through your proxy.</p>
<p>If it's difficult or impossible to get the proxy to allow
Subversion traffic, but you want to check out the Subversion sources,
you may be able to go around the proxy. Some proxies that filter port
80 nevertheless allow anything on port 81. For this reason, the
<tt>svn.collab.net</tt> repository server listens on port 81 as well
as on port 80. Try:</p>
<pre>
svn checkout http://svn.collab.net:81/repos/svn/trunk subversion
</pre>
<p>and maybe the proxy will let you through. Another strategy is to
attempt the checkout over SSL, which many proxies allow:</p>
<pre>
svn checkout https://svn.collab.net/repos/svn/trunk subversion
</pre>
<p>Of course, your svn client will have to have been built with ssl
support; just pass <tt>--with-ssl</tt> to subversion's
<tt>./configure</tt> script. You can check to see whether the 'https'
schema is supported by running <tt>svn --version</tt>.</p>
<![CDATA[=========================================================]]>
<h3><a name="paranoid"/>My admins don't want me to have a HTTP server for
Subversion. What can I do if I still want remote usage?</h3>
<p>A simple option is to use the <b>svnserve</b> server instead of
Apache. See <a
href="http://svnbook.red-bean.com/html-chunk/ch06.html">chapter 6</a>
in the Subversion book for details.</p>
<p>However, if your admins don't want you to run Apache, it's very
likely they don't want you to run a custom server process on port 3690
either! So the rest of this answer assumes that your admins
<i>are</i> okay with you using an existing SSH infrastructure.</p>
<p>If you previously used CVS, you may have used SSH to login to the
CVS server. The ra_svn Subversion access method is the equivalent way
of doing this with Subversion. Just use the "svn+ssh" prefix to your
Subversion repository URL.</p>
<pre>
$ svn checkout svn+ssh://your.domain.com/full/path/to/repository
</pre>
<p>This makes your SSH program launch a private 'svnserve' process on
the remote box, which accesses the repository as your UID and tunnels
the information back over the encrypted link.</p>
<p>However, another solution that can be used instead is to leverage
SSH port forwarding to connect to the protected server via ra_dav.
You would connect via SSH to a machine behind your firewall that can
access your Subversion server. Note that this SSH server does
<b>not</b> have to be the same as where Subversion is installed. It
can be, but it doesn't have to be.</p>
<p>Then, you create a local port forward that connects to the HTTP
server that houses your Subversion repository. You would then
'connect' to the Subversion repository via this local port. Then,
the request will be sent 'tunneled' via SSH server to your Subversion
server.</p>
<p>An example: a Subversion ra_dav setup is behind your company firewall
at 10.1.1.50 (call it svn-server.example.com). Your company allows SSH
access via publicly accessible ssh-server.example.com. Internally, you
can access the Subversion repository via
http://svn-server.example.com/repos/ours.</p>
<p><i>Example</i>: client connecting to ssh-server with port-forwarding
and checking out via the port forward</p>
<pre>
% ssh -L 8888:svn-server.example.com:80 me@ssh-server.example.com
% svn checkout http://localhost:8888/repos/ours
</pre>
<p>Note that your svn-server.example.com could also have its httpd
instance running on an unprivileged port by a non-trusted user. This
will allow your Subversion server not to require root access.</p>
<!-- Can you use svn switch to switch your WC between your internal and
external Subversion server? I think so. -->
<p>Joe Orton notes</p>
<pre>
The server is sensitive to the hostname used in the Destination header
in MOVE and COPY requests, so you have to be a little careful here - a
"ServerAlias localhost" may be required to get this working properly.
</pre>
<p>Some links on SSH port forwarding</p>
<ul>
<li><a href="http://www.onlamp.com/pub/a/onlamp/excerpt/ssh_11/index3.html"
>http://www.onlamp.com/pub/a/onlamp/excerpt/ssh_11/index3.html</a></li>
<li><a href="http://csociety.ecn.purdue.edu/~sigos/projects/ssh/forwarding/"
>http://csociety.ecn.purdue.edu/~sigos/projects/ssh/forwarding/</a></li>
<li><a href="http://www.zip.com.au/~roca/ttssh.html">TTSSH: A Win32 SSH client capable of port forwarding</a></li>
</ul>
<![CDATA[=========================================================]]>
<h3><a name="multi-proj">How do I manage several different projects under Subversion?</a></h3>
<p>It depends upon the projects involved. If the projects are
related, and are likely to share data, then it's best to create one
repository with several subdirectories like this:
<pre>
$ svnadmin create /repo/svn
$ svn mkdir file:///repo/svn/projA
$ svn mkdir file:///repo/svn/projB
$ svn mkdir file:///repo/svn/projC
</pre>
If the projects are completely unrelated, and not likely to share data
between them, then it's probably best to create separate and unrelated
repositories.
<pre>
$ mkdir /repo/svn
$ svnadmin create /repo/svn/projA
$ svnadmin create /repo/svn/projB
$ svnadmin create /repo/svn/projC
</pre>
<p>
The difference between these two approaches is this (as explained by
Ben Collins-Sussman &lt;sussman@collab.net&gt;):
<ul>
<li>
<pre>
In the first case, code can easily be copied or moved around
between projects, and the history is preserved. ('svn cp/mv'
currently only works within a single repository.)
</pre>
</li>
<li>
<pre>
Because revision numbers are repository-wide, a commit to any
project in the first case causes a global revision bump. So it
might seem a bit odd if somebody has 'projB' checked out, notices
that 10 revisions have happened, but projB hasn't changed at
all. Not a big deal, really. Just a little weird at first.
This already happens to svn, everytime people commit to
rapidsvn. :-)
</pre>
</li>
<li>
<pre>
The second case might be easier to secure; it's easier to insulate
projects from each other (in terms of users and permissions)
using Apache's access control. In the 1st case, you'll need a
fancy hook script in the repository that distinguishes projects
("is this user allowed to commit to this particular subdir?") Of
course, we already have such a script, ready for you to use.
</pre>
</li>
</ul>
<![CDATA[=========================================================]]>
<h3><a name="multi-merge">How do I merge two completely separate repositories?</a></h3>
<p>If you don't care about retaining all the history of one of the
repositories, you can just create a new directory under one project's
repository, then import the other.
<p>If you care about retaining the history of both, then you can use
'svnadmin dump' to dump one repository, and 'svnadmin load' to load it into
the other repository. The revision numbers will be off, but you'll
still have the history.
<p>Peter Davis &lt;peter@pdavis.cx&gt; also explains a method using svn's
equivalent to CVS modules:
<p><blockquote>
<p>As long as the merging takes place in separate directory
trees, you can use svn's version of CVS modules.
<p>Set the <em>svn:externals</em> property on a directory to checkout
directories from other repositories whenever the original
directory is checked out. The repository remains separate,
but in the working copy it appears that they have been merged.
If you commit to the imported directory, it will affect the
external repository.
<p>The merge isn't completely clean: the import only affects
working copies, so you won't be able to use a URL in the first
repository to access modules imported from the second. They
remain separate URLs.
</blockquote>
<![CDATA[=========================================================]]>
<h3><a name="nfs">Should I store my repository on a NFS server?</a></h3>
<p>No, don't ever do that. Berkeley DB does not <a
href="http://www.sleepycat.com/docs/ref/env/remote.html">support
storage of databases on remote file systems</a>. Some NFS servers
claim that they explicitly support use of BDB on NFS-mounted
partitions, but we've only ever seen BDB databases get corrupted when
living on an NFS or SMB network drive.</p>
<p>A working copy, however, <b>can</b> be stored on a NFS server (i.e.
your home directory is on a NFS server). On Linux NFS servers, due to the
volume of renames used internally in Subversion when checking out files,
some users have reported that 'subtree checking' should be disabled (it's
enabled by default). Please see <a
href="http://nfs.sourceforge.net/nfs-howto/server.html"
>NFS Howto Server Guide</a> and <b>exports(5)</b> for more information on
how to disable subtree checking.</p>
<![CDATA[=========================================================]]>
<h3><a name="bdblogs">Why is my repository taking up so much disk space?</h3>
<p>The repository stores all your data in a Berkeley DB "environment"
in the repos/db/ subdirectory. The environment contains a collection
of tables and bunch of logfiles (log.*). Berkeley DB journals all
changes made to the tables, so that the tables can be recovered to a
consistent state in case of interruptions (<a
href="#wedged-repos">more info</a>).</p>
<p>The logfiles will grow forever, eating up disk space, unless you,
(as the repository administrator) do something about it. At any given
moment, Berkeley DB is only using a couple of logfiles actively; the
rest can be safely deleted. If you keep all the logfiles around
forever, then in theory Berkeley DB can replay every change to your
repository from the day it was born. But in practice, if you're
making backups, it's probably not worth the cost in disk space.</p>
<p>Use <code>svnadmin</code> to see
which log files can be deleted. You may want a cron job to do this.</p>
<pre>
$ svnadmin list-unused-dblogs /repos
/repos/db/log.000003
/repos/db/log.000004
[...]
$ svnadmin list-unused-dblogs /repos | xargs rm
# disk space reclaimed!
</pre>
<p>You could instead use Berkeley DB's <code>db_archive</code> command:</p>
<pre>
$ db_archive -a -h /repos/db | xargs rm
# disk space reclaimed!
</pre>
<p>See also <code>svnadmin hotcopy</code> or <code>hotbackup.py</code>.</p>
<p><strong>Note:</strong> If you use Berkeley DB 4.2, Subversion 0.35
or later will create new repositories with automatic log file removal
enabled. You can change this by passing the <code>--bdb-log-keep</code>
option to <code>svnadmin create</code>. Refer to the section about the <a
href="http://www.sleepycat.com/docs/api_c/env_set_flags.html#DB_LOG_AUTOREMOVE">
<code>DB_LOG_AUTOREMOVE</code></a> flag in the Berkeley DB manual.</p>
<![CDATA[=========================================================]]>
<h3><a name="reposperms">How do I set repository
permissions correctly?</a></h3>
<p>If you have multiple processes (httpd, svnserve, etc.) accessing
the repository, look at <a
href="http://svnbook.red-bean.com/html-chunk/ch06s05.html"> this
section of the Subversion Book</a>.</p>
<![CDATA[=========================================================]]>
<h3><a name="readonly">Why do read-only operations still need repository
write access?</a></h3>
<p>Certain client operations are "read-only", like checkouts and
updates. From an access-control standpoint, apache treats them as
such. But libsvn_fs (the repository filesystem API) still has to
write temporary data in order to produce tree-deltas. So the process
accessing the repository always requires both read <em>and</em> write
access to the Berkeley DB files in order to function.</p>
<p>In particular, the repository responds to many "read-only"
operations by comparing two trees. One tree is the usually the HEAD
revision, and the other is often a temporary transaction-tree -- thus
the need for write access.</p>
<![CDATA[=========================================================]]>
<h3><a name="removal">
How do I completely remove a file from the repository's history?
</a></h3>
<p>There are special cases where you might want to destroy all
evidence of a file or commit. (Perhaps somebody accidentally committed
a confidential document.) This isn't so easy, because Subversion is
deliberately designed to never lose information. Revisions are
immutable trees which build upon one another. Removing a revision from
history would cause a domino effect, creating chaos in all subsequent
revisions and possibly invalidating all working copies.</p>
<p>The project has plans, however, to someday implement an <b>svnadmin
obliterate</b> command which would accomplish the task of permanently
deleting information. (See <a
href="http://subversion.tigris.org/issues/show_bug.cgi?id=516">issue
516</a>.)</p>
<p>In the meantime, your only recourse is to <b>svnadmin dump</b> your
repository, then pipe the dumpfile through <b>svndumpfilter</b>
(excluding the bad path) into an <b>svnadmin load</b> command. See <a
href="http://svnbook.red-bean.com/html-chunk/ch05.html">chapter 5</a>
of the Subversion book for details about this.</p>
<![CDATA[=========================================================]]>
<h3><a name="change-log-msg">
How do I change the log message for a revision after it's been committed?
</a></h3>
<p>Log messages are kept in the repository as properties attached to each
revision. By default, the log message property (<em>svn:log</em>) cannot be
edited once it is committed. That is because changes to <a
href="http://svnbook.red-bean.com/svnbook/ch05.html#svn-ch-5-sect-1.2">revision
properties</a> (of which <em>svn:log</em> is one) cause the property's
previous value to be permanently discarded, and Subversion tries to prevent
you from doing this accidentally. However, there are a couple of ways to get
Subversion to change a revision property.</p>
<p>The first way is for the repository administrator to enable revision
property modifications. This is done by creating a hook called
"pre-revprop-change" (see <a
href="http://svnbook.red-bean.com/svnbook/ch05s02.html#svn-ch-5-sect-2.1">this
section</a> in the Subversion book for more details about how to do this).
The "pre-revprop-change" hook has access to the old log message before it is
changed, so it can preserve it in some way (for example, by sending an email).
Once revision property modifications are enabled, you can change a revision's
log message by passing the --revprop switch to <b>svn propedit</b> or <b>svn
propset</b>, like either one of these:</p>
<pre>
$ svn propedit -r N --revprop svn:log URL
$ svn propset -r N --revprop svn:log "new log message" URL
</pre>
<p>where N is the revision number whose log message you wish to change, and
URL is the location of the repository. If you run this command from within a
working copy, you can leave off the URL.</p>
<p>The second way of changing a log message is to use <b>svnadmin setlog</b>.
This must be done by referring to the repository's location on the filesystem.
You cannot modify a remote repository using this command.</p>
<pre>
$ svnadmin setlog REPOS_PATH -r N FILE
</pre>
<p>where REPOS_PATH is the repository location, N is the revision number whose
log message you wish to change, and FILE is a file containing the new log
message. If the "pre-revprop-change" hook is not in place (or you want to
bypass the hook script for some reason), you can also use the --bypass-hooks
option. However, if you decide to use this option, be very careful. You may
be bypassing such things as email notifications of the change, or backup
systems that keep track of revision properties.</p>
<![CDATA[=========================================================]]>
<h3><a name="patch">How do I submit a patch for Subversion?</a></h3>
<p>FIRST, read the <a href="http://svn.collab.net/repos/svn/trunk/HACKING">HACKING</a> document.
<p>Once you've digested that, send a mail to the dev list with the
word [PATCH] and a one-line description in the subject, and include
the patch inline in your mail (unless your MUA munges it up
totally). Then a committer will pick it up, apply it (making any
formatting or content changes necessary), and check it in.
<p>The basic process looks like this:
<pre>
<blockquote>
$ svn co http://svn.collab.net/repos/svn/trunk subversion
$ cd subversion/www
[ make changes to project_faq.html ]
$ svn diff project_faq.html > /tmp/foo
$ Mail -s "[PATCH] FAQ updates" < /tmp/foo
</blockquote>
</pre>
Of course, the email you send should contain a nice long
explanation about what the patch does, as per the
<a href="http://svn.collab.net/repos/svn/trunk/HACKING">HACKING</a>
document, but you already know that, since you read and completely
understood it <em>before</em> actually hacking the code, right? :)
<![CDATA[=========================================================]]>
<h3><a name="in-place-import">How can I do an in-place 'import'
(i.e. add a tree to subversion without moving or deleting the
original working copy)?</a></h3>
<p>Suppose, for example, that you wanted to put some of /etc under
version control inside a brand-new repository you created using:
</p>
<pre>
# svnadmin create /root/svn
</pre>
<p>To do this you would:
</p>
<pre>
# cd /
# svn co file:///root/svn etc
# cd etc
# svn add apache samba alsa X11
# svn commit -m "configury"
</pre>
<p>This takes advantage of the a hidden feature of add which allows it
to create working copies for directories which do not yet exist in the
repository.</p>
<p>There is an issue filed for enhancing <tt>svn&nbsp;import</tt> to
be able to convert the imported tree to a working copy automatically;
see <a href="http://subversion.tigris.org/issues/show_bug.cgi?id=1328"
>http://subversion.tigris.org/issues/show_bug.cgi?id=1328</a>.</p>
<![CDATA[=========================================================]]>
<h3><a name="dumpload">What is this "dump/load cycle" people
sometimes talk about when upgrading a Subversion server?</a></h3>
<p>Subversion's repository database schema has changed occasionally
during development. Old repositories, created with a pre-1.0
development version of Subversion, may require the following operation
when upgrading. If a schema change happens between Subversion
releases X and Y, then repository administrators upgrading to Y must
do the following: </p>
<p>
<ol>
<li>Shut down svnserve, Apache, and anything else that might be
accessing the repository.
</li>
<li>
<b>
<tt>svnadmin&nbsp;dump&nbsp;/path/to/repository&nbsp;>&nbsp;dumpfile.txt</tt>
</b>,
using version X of svnadmin.
</li>
<li>
<b>
<tt>mv&nbsp;/path/to/repository&nbsp;/path/to/saved-old-repository</tt>
</b>
</li>
<li>Now upgrade to Subversion Y (i.e., build and install Y, replacing X).
</li>
<li>
<b><tt>svnadmin&nbsp;create&nbsp;/path/to/repository</tt></b>, using version
Y of svnadmin.
</li>
<li>
<b>
<tt>svnadmin&nbsp;load&nbsp;/path/to/repository&nbsp;<&nbsp;dumpfile.txt</tt>
</b>,
again using version Y of svnadmin.
</li>
<li>Copy over hook scripts, etc, from the old repository to the new one.
</li>
<li>Restart svnserve, Apache, etc.
</li>
</ol>
</p>
<p> See
<a href="http://svnbook.red-bean.com/html-chunk/ch05s03.html#svn-ch-5-sect-3.4"
>http://svnbook.red-bean.com/html-chunk/ch05s03.html#svn-ch-5-sect-3.4</a>
for more details on dumping and loading.</p>
<p> <b>Note</b>: Most upgrades of Subversion do <i>not</i> involve a
dump and load. When one is required, the release announcement and the
CHANGES file for the new version will carry prominent notices about
it. If you don't see such a notice, then there has been no schema
change, and no dump/load is necessary. </p>
<![CDATA[=========================================================]]>
<h3><a name="sspi">How do I allow clients to authenticate against a
Windows domain controller using SSPI authentication?</a></h3>
<p><a href="http://tortoisesvn.tigris.org">TortoiseSVN</a> has an excellent
document that describes setting up a Subversion server on Windows. Go to
<a href="http://tortoisesvn.tigris.org/docs/TortoiseSVN_en/ch03.html#tsvn-serversetup-apache-5"
>http://tortoisesvn.tigris.org/docs/TortoiseSVN_en/ch03.html#tsvn-serversetup-apache-5</a>,
to see the section on SSPI authentication.</p>
<p>An earlier version of this document left out a line:
<pre>
SSPIOfferBasic On
</pre></p>
<p>Without this line, a browser will prompt for the user's credentials,
but Subversion clients will not. (The browser understands SSPI
authentication, but the current release of Neon - Subversion's HTTP
library - handles only basic authentication.) Because the client never
asks for credentials, any action that requires authentication will fail.
Adding this line tells <tt>mod_auth_sspi</tt> to use basic authentication with
the client, but to use the Windows domain controller to authenticate
the credentials.</p>
<![CDATA[=========================================================]]>
<h3><a name="adm-dir">I don't like the ".svn" directory name, and
prefer "SVN" or something else. How do I change it?</a></h3>
<p>We recommend that you live with ".svn" if you possibly can. If you
use some other name, your working copy may not work with Subversion
clients other than the one you regularly use. However, if you
absolutely must, you can simply change this line in
<tt>subversion/include/svn_wc.h</tt> from </p>
<p><pre>
#define SVN_WC_ADM_DIR_NAME ".svn"
</pre></p>
<p>
to
</p>
<p><pre>
#define SVN_WC_ADM_DIR_NAME "SVN"
</pre></p>
<p>
then recompile your client.
</p>
<![CDATA[=========================================================]]>
<h3><a name="case-change">I checked in a file but had the wrong case
in the filename. How do I change it?</a></h3>
<p>If you're adding files on an operating system with a case-insensitive
filesystem, such as Windows, you might find you accidentally add a file
with the wrong case in the filename. You can correct this by copying
the file somewhere temporary, deleting the file from Subversion, then
adding the copy with the correct case, or by performing a move
operation with Subversion URLs. Using URLs is recommended, because it
will preserve history for the file, and will take effect immediately.</p>
<p>Both fixes will leave Windows working copies with problems,
because Windows can still get confused when trying to add the file with
the new case. One way of fixing the problem is to delete your working
copy and check out again. If this is not possible, you must perform a
two step update.</p>
<p>
For each file with the wrong the case, do:
<pre>svn mv svn://svnserver/path/to/file.java svn://svnserver/path/to/File.java</pre>
</p>
<p>
Then for each working copy, change to the relevant directory and do:
<pre>
svn update *
svn update
</pre>
The first update will remove <tt>file.java</tt> from your working copy,
the second update will add <tt>File.java</tt>, leaving you with a
correct working copy.
</p>
<p>As you can see, adding a file with the wrong case is tricky to fix on
an operating system that has a case insensitive filesystem. Do try to
get it right when you add the file the first time!</p>
<![CDATA[=========================================================]]>
<h3><a name="merge-using-tags">I can't use tags to merge changes from a
branch into the trunk like I used to with CVS, can I?</a></h3>
<p>As shown below it is possible to merge from a branch to the trunk
without remembering one revision number. Or vice versa (not shown in the
example).</p>
<p>The example below presumes an existing repository in <tt>/home/repos</tt>
in which you want to start a branch named <tt>bar</tt> containing a file
named <tt>foo</tt> you are going to edit.</p>
<p>For the purpose of tracing branch merges, this repository has set up
<tt>tags/branch_traces/</tt> to keep tags.</p>
<pre># setup branch and tags
$ svn copy file:///home/repos/trunk \
file:///home/repos/branches/bar_branch \
-m "start of bar branch"
$ svn copy file:///home/repos/branches/bar_branch \
file:///home/repos/tags/branch_traces/bar_last_merge \
-m "start"
# checkout branch working copy
$ svn checkout file:///home/repos/branches/bar_branch wc
$ cd wc
# edit foo.txt file and commit
$ echo "some text" &gt;&gt;foo.txt
$ svn commit -m "edited foo"
# switch to trunk and merge changes from branch
$ svn switch file:///home/repos/trunk
$ svn merge file:///home/repos/tags/branch_traces/bar_last_merge \
file:///home/repos/branches/bar_branch
# and check the file content of 'foo.txt'
</pre>
<![CDATA[=========================================================]]>
<h3><a name="version-value-in-source">Why doesn't the $Revision$
keyword do what I want? It expands to the file's last-changed revision,
but I want something that will expand to the file's current revision.</a></h3>
<p>
Subversion increments the revision number of the repository as a
whole, so it can't expand any keyword to be that number - it would
have to search and possibly modify every file in your working copy on
every update and commit.
</p>
<p>
The information you want (the revision of your working copy) is
available from the command <tt>svnversion</tt>; it gives you
information on the revision level of a working copy given a path (see
<tt>svnversion --help</tt> for details).
</p>
<p>
You can incorporate it into your build or release process to get the
information you need into the source itself. For example, in a build
environment based on <tt>make</tt>, add something like this to your
<tt>Makefile</tt>:
<pre>
##
## on every build, record the working copy revision string
##
svn_version.c: FORCE
echo -n 'const char* svn_version(void) { const char* SVN_Version = "' \
> svn_version.c
svnversion -n . >> svn_version.c
echo '"; return SVN_Version; }' >> svn_version.c
</pre>
<p>
any executable that links in <tt>svn_version.o</tt> will be able to
call the function <tt>svn_version()</tt> to get a string that
describes exactly what revision was built.
</p>
<p>
Windows users may want to use <tt>SubWCRev.exe</tt>, available from
the <a
href='http://tortoisesvn.tigris.org/download.html'>TortoiseSVN
download page</a>; it replaces all <tt>$WCREV$</tt> tags in a given
file with the current working copy revision.
</p>
<![CDATA[=========================================================]]>
<p>
<hr>
<p>
<h2>Troubleshooting:</h2>
<p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="permissions">My repository seems to get stuck all the
time, giving me errors about needing recovery (DB_RUNRECOVERY). What
could be the cause?</a></h3>
<p>The BerkeleyDB database in your repository is susceptible to
interruptions. If a process accessing the database exits without
"cleanly" closing the environment, then the database is left in an
inconsistent state. Common causes of this include:</p>
<ul>
<li>the process crashing/segfaulting</li>
<li>the process being forcibly killed</li>
<li>the process exiting when it hits a permission problem</li>
</ul>
<p>To make the repository function again, simply run "svnadmin
recover". This rewinds the repository back to a consistent state.
(See <a href="#wedged-repos">this question</a> for more
information.)</p>
<p>The <strong>best</strong> way to prevent this problem is to get
your repository permissions and ownership set up correctly. Segfaults
and forced killings are pretty rare; far and away, this problem almost
always results from one process accessing the repository and
accidentally changing ownership or permissions. Then another process
tries to access and chokes on the permissions.</p>
<p>Here are our recommendations:</p>
<ul>
<li>Try to have as <em>few</em> users access the repository as
possible. For example, run apache or 'svnserve -d' as a specific
user, and make the repository wholly owned by that user. Don't
allow any other users to access the repository via
<tt>file:///</tt> urls, and be sure to run 'svnlook' and
'svnadmin' only as the user which owns the repository.</li>
<li>If your clients are accessing via <tt>file:///</tt> or
<tt>svn+ssh://</tt>, then there's no way to avoid access by
multiple users. In that case, read <a href="
http://svnbook.red-bean.com/html-chunk/ch06s05.html">the last
section in chapter 6</a>, and pay particular attention to the
"checklist" sidebar at the bottom. It outlines a number of steps
to make this scenario safer.</li>
</ul>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="wedged-repos">Every time I try to access my repository, the
process just hangs. Is my repository corrupt?</a></h3>
<p>
Your repository is not corrupt, nor is your data lost. If your process
accesses the repository directly (mod_dav_svn, svnlook, svnadmin, or
if you access a `file://' URL), then it's using Berkeley DB to access
your data. Berkeley DB is journaling system, meaning that it logs
everything it is about to do before it does so. If your process is
interrupted (Control-C, or segfault), then a lockfile is left behind,
along with a logfile describing unfinished business. Any other
process that attempts to access the database will just hang, waiting
for the lockfile to disappear. To awaken your repository, you need to
ask Berkeley DB to either finish the work, or rewind the database to a
previous state that is known to be consistent.</p>
<p><b><font color="red">WARNING:</font> you can seriously corrupt your
repository if you run recover and another process accesses the repository.
</b></p>
<p>Make absolutely sure you disable all access to the repository before
doing this (by shutting down Apache, removing executable permissions from
'svn'). Make sure you run this command as the user that owns and manages
the database, and not as root, else it will leave root-owned files in the
db directory which cannot be opened by the non-root user that manages the
database, which is typically either you or your Apache process. Also be
sure to have the correct umask set when you run recover, since failing to
do so will lock out users that are in the group allowed to access the
repository.</p>
<p>
Simply run:</p>
<pre>
svnadmin recover /path/to/repos
</pre>
<p>Once the command has completed, check the permissions in the
<code>db</code> directory of the repository.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="wedged-wc">Every time I try to run a svn command, it says my
working copy is locked. Is my working copy corrupt?</a></h3>
<p>
Your working copy is not corrupt, nor is your data lost. Subversion's
working copy is journaling system, meaning that it logs everything it
is about to do before it does so. If the svn client program is
interrupted violently (segfault or killed, not with Control-C), then
one or more lockfiles are left behind, along with logfiles describing
unfinished business. (The`svn status' command will show an 'L' next
to locked directories.) Any other process that attempts to access the
working copy will fail when it sees the locks. To awaken your working
copy, you need to tell the svn client to finish the work. Simply
run:</p>
<pre>
svn cleanup working-copy
</pre>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="wc-out-of-date">I'm trying to commit, but Subversion says my
working copy is out of date?</a></h3>
<p>
When you commit, Subversion bumps the revision numbers of all nodes the commit
touches. This means that in a single folder, the files and folders might
be at different revisions, depending on when you last committed them.</p>
<p>
For certain operations (deletes and property modifications), if the repository
has a more recent version of the node, the commit will be rejected, to prevent
data loss.</p>
<p>
See
<a href="http://svnbook.red-bean.com/svnbook/ch02s03.html#svn-ch-2-sect-3.4">
The Limitations of Mixed Revisions</a> in the
<a href="http://svnbook.red-bean.com/">Version Control with Subversion</a>
for details.</p>
<p>
To prevent this error, simply update your working copy using:</p>
<pre>
svn update working-copy
</pre>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="unrecognized-url-error">I just built the distribution binary,
and when I try to check out Subversion, I get an error about an
"Unrecognized URL scheme." What's up with that?</a></h3>
<p>Subversion uses a plugin system to allow access to repositories.
Currently there are three of these plugins: ra_local allows access to
a local repository, ra_dav which allows access to a repository via
WebDAV, and ra_svn allows local or remote access via the svnserve
server. When you attempt to perform an operation in subversion, the
program tries to dynamically load a plugin based on the URL scheme. A
`file://' URL will try to load ra_local, and an `http://' URL will try
to load ra_dav.</p>
<p>The error you are seeing means that the dynamic linker/loader can't find
the plugins to load. This normally happens when you build subversion with
shared libraries, then attempt to run it without first running 'make
install'. Another possible cause is that you ran make install, but the
libraries were installed in a location that the dynamic linker/loader
doesn't recognize. Under Linux, you can allow the linker/loader to find the
libraries by adding the library directory to /etc/ld.so.conf and running
ldconfig. If you don't wish to do this, or you don't have root access, you
can also specify the library directory in the LD_LIBRARY_PATH environment
variable.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="db-recover">I'm getting errors finding or opening a repository,
but I know my repository URL is correct. What's wrong?</a></h3>
<p>See <a href="#wedged-repos">this faq.</a></p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="configure-sed-error">When I run `<tt>configure</tt>', I get errors about
<tt>subs-1.sed&nbsp;line&nbsp;38:&nbsp;Unterminated&nbsp;`s'&nbsp;command</tt>.
What's wrong?</a></h3>
<p>
You probably have old copies of
<tt>/usr/local/bin/apr-config</tt> and
<tt>/usr/local/bin/apu-config</tt> on your system. Remove them, make
sure the <tt>apr/</tt> and <tt>apr-util/</tt> that you're
building with are completely up-to-date, and try again.
</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="linux-bdb42-build">I'm having trouble building
Subversion under *NIX with BerkeleyDB 4.2.x What should I do?</a></h3>
<p>Subversion compiles against BerkeleyDB by asking apr-util for the
appropriate BDB build options. This means that either the apr-util in
your Subversion tarball or the one in your Apache tree must
successfully detect BDB. Normally one does this by passing
"--with-berkeley-db" to apr-util's ./configure. (When you pass this
argument to either Apache or Subversion's ./configure, it's really
just getting passed down to apr-util's ./configure.)</p>
<p>The problem is that BerkeleyDB 4.2 is newer than the latest
released version of apr-util, so apr-util doesn't know how to detect
it.</p>
<p>The long-term solution is already in place: the latest apr-util in
CVS has code to explicitly detect BDB 4.2. When either apr-util or
Apache httpd does another release, this ability will widely
available.</p>
<p>In the short term, the best thing to do is apply <a
href="db42-support-patch.txt">this patch</a> to your apr-util's
./configure script -- either to the apr-util in your apache tree (if
you're building Apache before Subversion), or to the apr-util in your
Subversion tarball (if you're not building Apache at all.) This patch
is the new DB 4.2 detection code already in the latest apr-util
CVS.</p>
<p>If you've building Apache first, apply the patch to httpd-2.0.48's
apr-util's configure script, and then build with these options:</p>
<pre>
$ configure \
--enable-dav \
--enable-so \
--with-berkeley-db=/usr/local/BerkeleyDB.4.2 \
--with-dbm=db42
</pre>
<p>
You can confirm that Apache is built with the proper BDB libraries with the
following command:
</p>
<pre>
$ ldd /usr/local/apache2/bin/httpd | fgrep libdb
libdb-4.2.so => /usr/local/BerkeleyDB.4.2/lib/libdb-4.2.so
</pre>
<p>And then you can simply build Subversion with no mention of BDB.
(...although Subversion <i>might</i> need to be told where to find
your Apache installation, if it's in a non-standard place.)</p>
<p>If you're not building Apache, apply the patch to the apr-util
./configure script in your Subversion tree, and use similar build
options:</p>
<pre>
$ configure \
--with-berkeley-db=/usr/local/BerkeleyDB.4.2 \
--with-dbm=db42
</pre>
<p>
Again, you can confirm that Subversion was built against the proper BDB
library with the following:
</p>
<pre>
$ ldd /usr/local/bin/svn | fgrep libdb
libdb-4.2.so => /usr/local/BerkeleyDB.4.2/lib/libdb-4.2.so
</pre>
</ol>
<p>
If you install your libraries in locations other than the defaults, you would
need to adjust the paths at each step accordingly.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="windows-msvc-build">I'm having trouble building Subversion
under Windows with MSVC++ 6.0. What should I do?</a></h3>
<p>
Probably you just need to get the latest platform SDK. The one that
ships with VC++ 6.0 is not recent enough.
</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="windows-drive-letter">How can I specify a Windows drive letter in
a <tt>file:</tt> URL?</a></h3>
<p>Like this:</p>
<pre>
svn import file:///d:/some/path/to/repos/on/d/drive
</pre>
<p>See <a
href="http://svnbook.red-bean.com/html-chunk/ch02s03.html#svn-ch-2-sidebar-1">
Repository URLs</a> in the Subversion Book for more details.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="write-over-dav">I'm having trouble doing write
operations to a Subversion repository over a network.</a></h3>
<p>For example, one user reported that imports worked fine over local
access:
<ul>
<pre>
$ mkdir test
$ touch test/testfile
$ svn import test file:///var/svn/test -m "Initial import"
Adding test/testfile
Transmitting file data .
Committed revision 1.
</pre>
</ul>
But not from a remote host:
<ul>
<pre>
$ svn import http://svn.sabi.net/test testfile -m "import"
nicholas's password: xxxxxxx
svn_error: #21110 : <Activity not found>
The specified activity does not exist.
</pre>
</ul>
</p>
<p> We've seen this when the REPOS/dav/ directory is not writable by
the httpd process. Check the permissions to ensure Apache can write
to the <tt>dav/</tt> directory (and to <tt>db/</tt>, of course). </p>
<![CDATA[=========================================================]]>
<h3><a name="windows-xp-server">Under Windows XP, the Subversion server
sometimes seems to send out corrupted data. Can this really
be happening?</a></h3>
<p>You need to install Window XP Service Pack 1. You can get all
sorts of information about that Service Pack here:</p>
<ul>
<a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;q317949"
>http://support.microsoft.com/default.aspx?scid=kb;EN-US;q317949</a>
</ul>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="ethereal">What is the best method of doing a network
trace of the conversation between a Subversion client and
server?</a></h3>
<p>Use <a href="http://ethereal.ntop.org/">Ethereal</a> to eavesdrop
on the conversation:
<!-- TODO: Make these instructions less specific to ra_dav. -->
<ol>
<li>Pull down the <i>Capture</i> menu, and choose <i>Start</i>.</li>
<li>Type <code>port 80</code> for <i>Filter</i>, and turn off
promiscuous mode.</li>
<li>Run your Subversion client.</li>
<li>Hit <i>Stop</i> (probably in a little box). Now you have a
capture. It looks like a huge list of lines.</li>
<li>Click on the <i>Protocol</i> column to sort.</li>
<li>Then, click on the first relevant TCP line to select it.</li>
<li>Right click, and choose <i>Follow TCP Stream</i>. You'll be
presented with the request/response pairs of the Subversion
client's HTTP conversion.</li>
</ol>
The above instructions are specific to the graphical version of
Ethereal, and may not apply to the commandline version (whose binary
is usually named tethereal).</p>
<p>Alternatively, if you have an up-to-date client (more recent than
the 0.16 tarball) you may set the <tt>neon-debug-mask</tt> parameter in your
<tt>servers</tt> configuration file to cause neon's debugging output
to appear when you run the <tt>svn</tt> client. The numeric value of
<tt>neon-debug-mask</tt> is a combination of the <tt>NE_DBG_...</tt> values
in the header file <tt>ne_utils.h</tt>. For neon 0.23.7 setting
<tt>neon-debug-mask</tt> to 130 (i.e. <tt>NE_DBG_HTTP+NE_DBG_HTTPBODY)</tt>
will cause the HTTP data to be shown.</p>
<p>You may well want to disable compression when doing a network
trace, see the <tt>compression</tt> parameter in the <tt>config</tt>
configuration file.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="revert">Why does the <tt>svn revert</tt> require an
explicit target? Why is it not recursive by default? These
behaviors differ from almost all the other subcommands.</a></h3>
<p>The short answer: it's for your own good.</p>
<p>Subversion places a very high priority on protecting your data, and
not just your versioned data. Modifications that you make to
already-versioned files, and new files scheduled for addition to the
version control system, must be treated with care.</p>
<p>Making the <tt>svn revert</tt> command require an explicit
target&mdash;even if that target is just '.'&mdash;is one way of
accomplishing that. This requirement (as well as requiring you to
supply the <tt>--recursive (-R)</tt> flag if you want that behavior)
is intended to make you really think about what you're doing, because
once your files are reverted, your local modifications are gone
forever.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="db3db4">When I start Apache, mod_dav_svn complains about
a "bad database version", that it found db-3.X, rather than
db-4.X.</a></h3>
<p>Your apr-util linked against DB-3, and svn linked against DB-4.
Unfortunately, the DB symbols aren't different. When mod_dav_svn is
loaded into Apache's process-space, it ends up resolving the
symbol names against apr-util's DB-3 library.</p>
<p>The solution is to make sure apr-util compiles against DB-4. You
can do this by passing specific switches to either apr-util's or
apache's configure: "--with-dbm=db4 --with-berkeley-db=/the/db/prefix".</p>
<![CDATA[=========================================================]]>
<h3><a name="redhat-db">I'm getting "Function not implemented" errors on RedHat
9, and nothing works. How do I fix this?</a></h3>
<p>This is not really a problem with Subversion, but it often affects
Subversion users.</p>
<p>RedHat 9 and Fedora ship with a Berkeley DB library that relies on the kernel
support for NPTL (the Native Posix Threads Library).</p>
<p>The kernels that RedHat provides have this support built in, but if you
compile your own kernel, then you may well not have the NPTL support. If that
is the case, then you will see errors like this:
<blockquote><pre>
svn: Berkeley DB error
svn: Berkeley DB error while creating environment for filesystem tester/db:
Function not implemented
</pre></blockquote>
This can be fixed in one of several ways:
<ul>
<li>Rebuild db4 for the kernel you're using.</li>
<li>Use a RedHat 9 kernel.</li>
<li>Apply the NPTL patches to the kernel you're using.</li>
<li>Use a recent (2.5.x) kernel with the NPTL support included.</li>
<li>Check if environment variable <code>LD_ASSUME_KERNEL</code> is set
to <code>2.2.5</code>, and if so, unset it before starting
Subversion (Apache). (You usually would set this variable to run
Wine or Winex on RedHat 9)</li>
</ul>
</p>
<p>To use the NPTL version of Berkeley DB you also need to use a glibc
library with NPTL support, which probably means the i686 version. See
<a
href="http://www.contactor.se/~dast/svnusers/archive-2004-03/0488.shtml">
http://www.contactor.se/~dast/svnusers/archive-2004-03/0488.shtml
</a> for details.
</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="no-author">Why does SVN log say "(no author)" for files
committed or imported via Apache (ra_dav)?</a></h3>
<p>If you allow anonymous write access to the repository via Apache,
the Apache server never challenges the SVN client for a username, and
instead permits the write operation without authentication. Since
Subversion has no idea who did the operation, this results in a log
like this:</p>
<blockquote><pre>
$ svn log
------------------------------------------------------------------------
rev 24:&nbsp; (no author) | 2003-07-29 19:28:35 +0200 (Tue, 29 Jul 2003)
</pre></blockquote>
<p>See the Subversion Book (<a
href="http://svnbook.red-bean.com/book.html#svn-ch-5-sect-4"
>"Networking a Repository"</a>)
to learn about configuring access restrictions in Apache.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="windows-access-denied">I'm getting occasional "Access Denied"
errors on Windows. They seem to happen at random. Why?</a></h3>
<p>These appear to be due to the various Windows services that monitor
the filesystem for changes (anti-virus software, indexing services, the
COM+ Event Notification Service). This is not really a bug in Subversion,
which makes it difficult for us to fix. A summary of the current state of
the investigation is available <a href=
"http://www.contactor.se/~dast/svn/archive-2003-10/0136.shtml">here</a>.
A workaround that should reduce the incidence rate for most people was
implemented in revision 7598; if you have an earlier version, please
update to the latest release.
</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="freebsd-hang">On FreeBSD, certain operations (especially
svnadmin create) sometimes hang. Why?</a></h3>
<p>This is usually due to a lack of available entropy on the system.
You probably need to configure the system to gather entropy from
sources such as hard-disk and network interrupts. Consult your system
manpages, specifically random(4) and rndcontrol(8) on how to effect
this change.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="301-error">I can see my repository in a web browser, but
'svn checkout' gives me an error about "301 Moved Permanently".
What's wrong?</a></h3>
<p>It means your httpd.conf is misconfigured. Usually this error happens
when you've defined the Subversion virtual "location" to exist within
two different scopes at the same time.</p>
<p>For example, if you've exported a repository as <tt>&lt;Location
/www/foo&gt;</tt>, but you've also set your <tt>DocumentRoot</tt> to
be <tt>/www</tt>, then you're in trouble. When the request comes in
for <tt>/www/foo/bar</tt>, apache doesn't know whether to find a
<i>real</i> file named <tt>/foo/bar</tt> within your
<tt>DocumentRoot</tt>, or whether to ask mod_dav_svn to fetch a file
<tt>/bar</tt> from the <tt>/www/foo</tt> repository. Usually the
former case wins, and hence the "Moved Permanently" error.</p>
<p>The solution is to make sure your repository
<tt>&lt;Location&gt;</tt> does <b>not</b> overlap or live within any
areas already exported as normal web shares.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="no-copy-history">I'm trying to look at an old version of my
file, but svn says something about "path not found". What's going
on?</a></h3>
<p>A nice feature of Subversion is that the repository understands
copies and renames, and preserves the historical connections. For
example, if you copy <tt>/trunk</tt> to <tt>/branches/mybranch</tt>,
then the repository understands that every file in the branch has a
"predecessor" in the trunk. Running <tt>svn log --verbose</tt> will
show you the historical copy, so you can see the rename:</p>
<pre>
r7932 | joe | 2003-12-03 17:54:02 -0600 (Wed, 03 Dec 2003) | 1 line
Changed paths:
A /branches/mybranch (from /trunk:7931)
</pre>
<p>Unfortunately, while the repository is aware of copies and renames,
almost all the svn client subcommands are <b>not</b> aware. Commands
like <tt>svn diff</tt>, <tt>svn merge</tt>, and <tt>svn cat</tt> ought
to understand and follow renames, but don't yet do this. It's
scheduled as post-1.0 feature, currently <a
href="http://subversion.tigris.org/issues/show_bug.cgi?id=1093">issue
#1093</a>. For example, if you ask <tt>svn diff</tt> to compare two
earlier versions of <tt>/branches/mybranch/foo.c</tt>, the command
will not automatically understand that the task actually requires
comparing two versions of <tt>/trunk/foo.c</tt>, due to the rename.
Instead, you'll see an error about how the branch-path doesn't exist
in the earlier revisions.</p>
<p>The workaround for all problems of this sort is to do the legwork
yourself. That is: <i>you</i> need to be aware of any renamed paths,
discover them yourself using <tt>svn log -v</tt>, and then provide
them explicitly to the svn client. For example, instead of
running</p>
<pre>
$ svn diff -r 1000:2000 http://host/repos/branches/mybranch/foo.c
svn: Filesystem has no item
svn: '/branches/mybranch/fooc..c' not found in the repository at revision 1000
</pre>
...you would instead run
<pre>
$ svn diff -r1000:2000 http://host/repos/trunk/foo.c
...
</pre>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="digest-auth">Why doesn't HTTP Digest auth work?</a></h3>
<p>This is probably due to a known bug in Apache HTTP Server (versions
2.0.48 and earlier), for which a patch is available, see
<a href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=25040"
>http://nagoya.apache.org/bugzilla/show_bug.cgi?id=25040</a>. You
may also want to read over
<a href="http://subversion.tigris.org/issues/show_bug.cgi?id=1608"
>http://subversion.tigris.org/issues/show_bug.cgi?id=1608</a>
to see if the description there matches your symptoms.
</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="xlc-compile">Compiling with xlc on AIX, I get compilation
errors. What's wrong?</a></h3>
<p>Adding <tt>-qlanglvl=extended</tt> to the
environment variable CFLAGS for configuration and build
will make xlc a bit more flexible and the code should
compile without error. See
<a href="http://www.contactor.se/~dast/svn/archive-2004-01/0922.shtml"
>http://www.contactor.se/~dast/svn/archive-2004-01/0922.shtml</a> and
its associated thread for more details.
</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="nonrecursive-checkout">I checked out a directory non-recursively
(with -N), and now I want to make certain subdirectories
"appear". But <tt>svn up subdir</tt> doesn't work.</a></h3>
<p>See <a
href="http://subversion.tigris.org/issues/show_bug.cgi?id=695">issue
695</a>. The current implementation of <tt>svn checkout -N</tt> is
quite broken. It results in a working copy which has missing entries,
yet is ignorant of its "incompleteness". Apparently a whole bunch of
CVS users are fairly dependent on this paradigm, but none of the
Subversion developers were. For now, there's really no workaround
other than to change your process: try checking out separate
subdirectories of the repository and manually nesting your working
copies.</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="mod_dav_svn-win32">I am trying to use mod_dav_svn
with Apache on Win32 and I'm getting an error saying that the
module cannot be found, yet the mod_dav_svn.so file is right
there in <tt>\Apache\modules.</tt></a></h3>
<p>The error message in this case is a little misleading. Most likely
Apache is unable to load one or more DLLs that <tt>mod_dav_svn.so</tt>
relies on. If Apache is running as a service it will not have the
same <tt>PATH</tt> as a regular user. Make sure that
<tt>libdb4*.dll</tt>, <tt>libeay32.dll</tt> and <tt>ssleay32.dll</tt>
are present in either <tt>\Apache\bin</tt> or
<tt>\Apache\modules</tt>. You can copy them from your Subversion
installation directory if they are not there.</p>
<p>If this still does not resolve the problem, you should use a tool
like <a href="http://www.dependencywalker.com">Dependency Walker</a>
on <tt>mod_dav_svn.so</tt> to see if there are any other unresolved
dependencies.</p>
<![CDATA[=========================================================]]>
<p>
<hr>
<p>
<h2>Developer questions:</h2>
<p>
<h3><a name="ramdisk-tests">How do I run the regression tests in a
ram disk?</a></h3>
<p>
See
<a href="http://www.contactor.se/~dast/svn/archive-2003-02/0068.shtml"
>http://www.contactor.se/~dast/svn/archive-2003-02/0068.shtml</a>.
</p>
<![CDATA[=========================================================]]>
<p>
<hr>
<p>
<h2>References:</h2>
<p>
<h3><a name="http-methods">What are all the HTTP methods Subversion
uses?</a></h3>
<p>The following email says it all. As the author points out,
Subversion does not actually use all of these WebDAV/DeltaV methods
yet, but it probably will someday, so if you're configuring a proxy,
you might as well allow all of them:</p>
<p>
<blockquote>
<pre>
From: Nuutti Kotivuori &lt;naked@iki.fi&gt;
Subject: Re: list of HTTP messages used by svn?
To: "Hamilton Link" &lt;helink@sandia.gov&gt;
Cc: dev@subversion.tigris.org
Date: Sat, 10 Aug 2002 13:51:52 +0300
Hamilton Link wrote:
&gt; Is there a full list of the HTTP methods svn uses somewhere, that
&gt; someone could piont me to? From the documentation I can find (in
&gt; particular project_faq.html and INSTALL), the list of methods svn
&gt; uses include at least the following:
&gt;
&gt; GET, PROPFIND, REPORT, OPTIONS, MERGE, MKACTIVITY, and CHECKOUT
&gt;
&gt; But since the lists I can find are only partial lists and nowhere
&gt; does it suggest these are all the ones used, I'm reluctant to make
&gt; any assumptions.
&gt;
&gt; If I had a complete list, I could go to the corp. proxy guy once
&gt; instead of many times, and reduce the risk of pissing him off and
&gt; being left with inadequate svn support in the proxy.
<a href="http://www.webdav.org/deltav/WWW10/deltav-intro.htm">http://www.webdav.org/deltav/WWW10/deltav-intro.htm</a>
A list copied from there:
HTTP/1.1: GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, CONNECT
WebDAV: LOCK, UNLOCK, PROPFIND, PROPPATCH, COPY, MOVE, MKCOL
DeltaV: CHECKIN, CHECKOUT, UNCHECKOUT, VERSION-CONTROL, REPORT,
UPDATE, LABEL, MERGE, MKWORKSPACE, BASELINE-CONTROL, MKACTIVITY
Subversion uses no methods outside these. It doesn't use all of them
either, but it's better to support the full WebDAV/DeltaV than just
some arbitrary subset. If the proxy being configured is a recent
Squid, it probably has everything from HTTP/1.1 and WebDAV - and then
it only needs the DeltaV extensions added.
You can give that list to your corp. proxy guy and explain to him that
he can check the RFC's for further information.
</pre>
</blockquote>
</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="bikeshed">What's a 'bikeshed'?</a></h3>
<p>See Poul-Henning Kamp's post to freebsd-hackers: <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/faq/misc.html#BIKESHED-PAINTING">http://www.freebsd.org/doc/en_US.ISO8859-1/books/faq/misc.html#BIKESHED-PAINTING</a>.
</p>
<![CDATA[-----------------------------------------------------------]]>
<h3><a name="baton">What's a 'baton'?</a></h3>
<p>Throughout subversion's source code there are many references to
'baton' objects. These are just <pre>void *</pre> datastructures that
provide context to a function. In other APIs, they're often called
<pre>void *ctx</pre> or <pre>void *userdata</pre> Subversion
developers call the structures "batons" because they're passed around
quite a bit.</p>