Subversion FAQ

    General questions:

  1. Why does this project exist?
  2. Is Subversion proprietary? I heard that it belongs to CollabNet.
  3. Is Subversion stable enough for me to use for my own projects?
  4. What is Subversion's pre-1.0 interoperability policy?
  5. What operating systems does Subversion run on?
  6. What's all this about a new filesystem? Is it like ext2?
  7. I heard that Subversion is an Apache extension?
  8. Does this mean I have to set up Apache to use Subversion?
  9. 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?
  10. Why don't you do X, just like SCM system Y?
  11. Why does the entire repository share the same revision number? I want each of my projects to have their own revision numbers.
  12. When's the next release?
  13. I have other questions. Where can I get more information?
  14. How-to:

  15. How do I check out the Subversion code?
  16. How do I create a repository? How do I import data into it?
  17. How do I convert an existing CVS repository into a Subversion repository?
  18. What if I'm behind a proxy?
  19. My admins don't want me to have a HTTP server for Subversion. What can I do if I still want remote usage?
  20. How do I manage several different projects under Subversion?
  21. How do I merge two completely separate repositories?
  22. Should I store my repository on a NFS server?
  23. Why is my repository taking up so much disk space?
  24. How do I set repository permissions correctly?
  25. Why do read-only operations still need repository write access?
  26. How do I completely remove a file from the repository's history?
  27. How do I submit a patch for Subversion?
  28. How can I do an in-place 'import' (i.e. add a tree to subversion without moving or deleting the original working copy)?
  29. What is this "dump/load cycle" people sometimes talk about when upgrading a Subversion server?
  30. How do I allow clients to authenticate against a Windows domain controller using SSPI Authentication?
  31. Troubleshooting:

  32. Every time I try to access my repository, the process just hangs. Is my repository corrupt?
  33. Every time I try to run a svn command, it says my working copy is locked. Is my working copy corrupt?
  34. 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?
  35. I'm getting errors finding or opening a repository, but I know my repository URL is correct. What's wrong?
  36. When I run `configure', I get errors subs-1.sed line 38: Unterminated `s' command. What's wrong?
  37. I'm having trouble building Subversion under Windows with MSVC++ 6.0. What should I do?
  38. How can I specify a Windows drive letter in a file: URL?
  39. I'm having trouble doing write operations to a Subversion repository over a network.
  40. Under Windows XP, the Subversion server sometimes seems to send out corrupted data. Can this really be happening?
  41. What is the best method of doing a network trace of the conversation between a Subversion client and server?
  42. Why does the svn revert require an explicit target? Why is it not recursive by default? These behaviors differ from almost all the other subcommands.
  43. When I start Apache, mod_dav_svn complains about a "bad database version", that it found db-3.X, rather than db-4.X.
  44. I'm getting "Function not implemented" errors on RedHat 9, and nothing works. How do I fix this?
  45. Why does SVN log say "(no author)" for files committed or imported via Apache (ra_dav)?
  46. I'm getting occasional "Access Denied" errors on Windows. They seem to happen at random. Why?
  47. Developer questions:

  48. How do I run the regression tests in a ram disk?
  49. References:

  50. What are all the HTTP methods Subversion uses?
  51. What's a 'bikeshed'?
  52. What's a 'baton'?


General questions:

Why does this project exist?

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.

Is Subversion proprietary? I heard that it belongs to CollabNet.

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 an Apache/BSD-style license which is fully compliant with the Debian Free Software Guidelines. In other words, you are free to download, modify, and redistribute Subversion as you please; no permission from CollabNet or anyone else is required.

Is Subversion stable enough for me to use for my own projects?

We think so! Subversion has small bugs here and there, but in general is reliable enough for real use. If it were any other project, it probably would have been declared "1.0" long ago; but because it's version-control software, we're being extra paranoid about labeling.

WARNING: while Subversion is definitely reliable, the API and protocols still change from release to release, so it would be wrong to say it is stable. That's why it's still Alpha sofware. This means that if you depend on Subversion, you should not be using whatever binary packages ship in your distribution, they are most likely months old, and will no longer interoperate with modern clients or servers. The developers release every month or so, and won't accept bug reports on old releases!

What does this mean to you? It means that if you depend on Subversion before it hits 1.0, you should always use the latest release, even if it means building from source. This requires diligence: subscribe to the dev list, notice when new releases come out, and upgrade. If you don't do this, you may (one day) accidentally discover that your clients and servers no longer interoperate.

What is Subversion's pre-1.0 interoperability policy?

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.)

What operating systems does Subversion run on?

All modern flavors of Unix, Win32, BeOS, OS/2, MacOS X.

Subversion is written in ANSI C and uses APR, the Apache Portable Runtime library, as a portability layer. Although the Subversion client will compile anywhere APR does, the Subversion server depends on Berkeley DB (as well as Apache 2.X, but Apache is as portable as APR). In theory Berkeley DB is portable to most of those platforms as well (except Win95/Win98, where it's known not to work due to shared-memory segment problems).

What's all this about a new filesystem? Is it like ext2?

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 Berkeley DB) and exports a C API that simulates 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.

I heard that Subversion is an Apache extension?

No. Subversion is a set of libraries. It comes with a command-line client that uses them. The Subversion server is Apache + mod_dav + mod_dav_svn, and the last module uses the Subversion libraries to speak to a repository. For more information about how Subversion uses WebDAV as its network protocol, see our docs. Also, as an alternative to Apache, you can use a small standalone Subversion server process. This will allow you to tunnel a custom protocol over ssh.

Does this mean I have to set up Apache to use Subversion?

The short answer: no.

The long answer: if you just want to access a repository, then you only need to build a Subversion client. If you want to host a networked repository, then you either need to set up Apache2 or use our standalone server process over ssh.

For more details about setting up a network accessible Subversion server, please read our INSTALL document.

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?

Don't worry, you can 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 Listen directive in httpd.conf from "Listen 80" to "Listen 8080" or whatever port number you want, and make sure to specify that port when you publish your repository URL (e.g., http://svn.mydomain.com:8080/repos/blah/trunk/).

Why don't you do X, just like SCM system Y?

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.

Why does the entire repository share the same revision number? I want each of my projects to have their own revision numbers.

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.

The revision number is only relevant to the repository, and user convenience. It has no 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.

When's the next release?

See our status page, http://subversion.tigris.org/project_status.html.

I have other questions. Where can I get more information?

Please send your questions or concerns to the Subversion Development mailing list. Alternatively, several Subversion users and developers can usually be contacted via IRC on channel #svn on irc.openprojects.net.


How-to:

How do I check out the Subversion code?

Use the subversion client:

	$ svn co http://svn.collab.net/repos/svn/trunk subversion

That will check out a copy of the Subversion source tree into a directory named subversion on your local machine.

How do I create a repository? How do I import data into it?

See http://svn.collab.net/repos/svn/trunk/README; specifically, look at section IV, the "Quickstart Guide".

How do I convert an existing CVS repository into a Subversion repository?

We are currently working on a script to convert CVS repositories to Subversion--It's called cvs2svn.py. Note that it is still under development, so only use it on a copy of your CVS repository and double check your results. Be sure to read the README for cvs2svn.

cvs2svn.py will be completed and well tested for Subversion's 1.0 release, but for now, use it with caution.

What if I'm behind a proxy?

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.)

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.

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.

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

   #  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

(Squid 2.4 and later already knows about PROPFIND.)

See also "What are all the HTTP methods Subversion uses?" for advice on additional HTTP methods to allow through your proxy.

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 svn.collab.net repository server listens on port 81 as well as on port 80. Try:

   svn checkout http://svn.collab.net:81/repos/svn/trunk subversion

and maybe the proxy will let you through. Another strategy is to attempt the checkout over SSL, which many proxies allow:

   svn checkout https://svn.collab.net/repos/svn/trunk subversion

Of course, your svn client will have to have been built with ssl support; just pass --with-ssl to subversion's ./configure script. You can check to see whether the 'https' schema is supported by running svn --version.

My admins don't want me to have a HTTP server for Subversion. What can I do if I still want remote usage?

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.

$ svn checkout svn+ssh://your.domain.com/full/path/to/repository

The preferred solution would be to use ra_dav combined with an Apache HTTP server configured with mod_ssl and appropriate authentication support. This should provide enough security for most users. However, we realize that there are places that do not allow adding servers of any kind with external connectivity.

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 not have to be the same as where Subversion is installed. It can be, but it doesn't have to be.

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.

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.

Example: client connecting to ssh-server with port-forwarding and checking out via the port forward

% ssh -L 8888:svn-server.example.com:80 me@ssh-server.example.com
% svn checkout http://localhost:8888/repos/ours

Note that your svn-server.example.com could also have its httpd instance running on an unpriviliged port by a non-trusted user. This will allow your Subversion server not to require root access.

Joe Orton notes

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.

Some links on SSH port forwarding

How do I manage several different projects under Subversion?

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:

	$ svnadmin create /repo/svn
	$ svn mkdir file:///repo/svn/projA
	$ svn mkdir file:///repo/svn/projB
	$ svn mkdir file:///repo/svn/projC
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.
	$ mkdir /repo/svn
	$ svnadmin create /repo/svn/projA
	$ svnadmin create /repo/svn/projB
	$ svnadmin create /repo/svn/projC

The difference between these two approaches is this (as explained by Ben Collins-Sussman <sussman@collab.net>):

How do I merge two completely separate repositories?

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.

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.

Peter Davis <peter@pdavis.cx> also explains a method using svn's equivalent to CVS modules:

As long as the merging takes place in separate directory trees, you can use svn's version of CVS modules.

Set the svn:externals 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.

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.

Should I store my repository on a NFS server?

In general, no. Berkeley DB does not support storage of databases on remote file systems. Some NFS servers claim that they explicitly support use of BDB on NFS-mounted partitions. Caveat emptor.

A working copy, however, can 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 NFS Howto Server Guide and exports(5) for more information on how to disable subtree checking.

Why is my repository taking up so much disk space?

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 (more info).

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.

Use svnadmin to see which log files can be deleted. You may want a cron job to do this.

$ svnadmin list-unused-dblogs /repos
/repos/db/log.000003
/repos/db/log.000004
[...]

$ svnadmin list-unused-dblogs /repos | xargs rm
# disk space reclaimed!

You could instead use Berkeley DB's db_archive command:

$ db_archive -a -h /repos/db | xargs rm
# disk space reclaimed!

See also svnadmin copy or hotbackup.py.

How do I set repository permissions correctly?

If you have multiple processes (httpd, svnserve, etc.) accessing the repository, look at this section of the Subversion Book.

Why do read-only operations still need repository write access?

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 and write access to the Berkeley DB files in order to function.

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.

How do I completely remove a file from the repository's history?

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.

The project has plans, however, to someday implement an svnadmin obliterate command which would accomplish the task of permanently deleting information. (See issue 516.)

In the meantime, your only recourse is to svnadmin dump your repository, then pipe the dumpfile through svndumpfilter (excluding the bad path) into an svnadmin load command.

How do I submit a patch for Subversion?

FIRST, read the HACKING document.

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.

The basic process looks like this:

$ 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
Of course, the email you send should contain a nice long explanation about what the patch does, as per the HACKING document, but you already know that, since you read and completely understood it before actually hacking the code, right? :)

How can I do an in-place 'import' (i.e. add a tree to subversion without moving or deleting the original working copy)?

Suppose, for example, that you wanted to put some of /etc under version control inside a brand-new repository you created using:

     # svnadmin create /root/svn

To do this you would:

     # cd /
     # svn co file:///root/svn etc
     # cd etc
     # svn add apache samba alsa X11 
     # svn commit -m "configury"

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.

What is this "dump/load cycle" people sometimes talk about when upgrading a Subversion server?

Subversion's repository database schema changes occasionally during development. We try to keep such changes to a minimum, but Subversion is pre-1.0 software, and we want to ship 1.0 with the best schema we can. If a schema change happens between Subversion releases X and Y, then repository administrators upgrading to Y must do the following:

  1. Shut down svnserve, Apache, and anything else that might be accessing the repository.
  2. svnadmin dump /path/to/repository > dumpfile.txt , using version X of svnadmin.
  3. mv /path/to/repository /path/to/saved-old-repository
  4. Now upgrade to Subversion Y (i.e., build and install Y, replacing X).
  5. svnadmin create /path/to/repository, using version Y of svnadmin.
  6. svnadmin load /path/to/repository < dumpfile.txt , again using version Y of svnadmin.
  7. Copy over hook scripts, etc, from the old repository to the new one.
  8. Restart svnserve, Apache, etc.

See http://svnbook.red-bean.com/html-chunk/ch05s03.html#svn-ch-5-sect-3.4 for more details on dumping and loading.

Note: Most upgrades of Subversion do not 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.

How do I allow clients to authenticate against a Windows domain controller using SSPI authentication?

TortoiseSVN has an excellent document that describes setting up a Subversion server on Windows. Go to http://tortoisesvn.tigris.org/doc/ch03.html, then click on "Authentication With A Windows Domain" to see the section on SSPI authentication.

An earlier version of this document left out a line:

   SSPIOfferBasic On

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 mod_auth_sspi to use basic authentication with the client, but to use the Windows domain controller to authenticate the credentials.


Troubleshooting:

Every time I try to access my repository, the process just hangs. Is my repository corrupt?

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.

WARNING: you can seriously corrupt your repository if you run recover and another process accesses the repository.

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.

Simply run:

svnadmin recover /path/to/repos

Once the command has completed, check the permissions in the db directory of the repository.

Every time I try to run a svn command, it says my working copy is locked. Is my working copy corrupt?

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 (Control-C, or segfault), 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:

svn cleanup working-copy

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?

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.

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.

I'm getting errors finding or opening a repository, but I know my repository URL is correct. What's wrong?

See this faq.

When I run `configure', I get errors about subs-1.sed line 38: Unterminated `s' command. What's wrong?

You probably have old copies of /usr/local/bin/apr-config and /usr/local/bin/apu-config on your system. Remove them, make sure the apr/ and apr-util/ that you're building with are completely up-to-date, and try again.

I'm having trouble building Subversion under Windows with MSVC++ 6.0. What should I do?

Probably you just need to get the latest platform SDK. The one that ships with VC++ 6.0 is not recent enough.

How can I specify a Windows drive letter in a file: URL?

Like this:

svn import file:///d:/some/path/to/repos/on/d/drive

See Repository URLs in the Subversion Book for more details.

I'm having trouble doing write operations to a Subversion repository over a network.

For example, one user reported that imports worked fine over local access:

But not from a remote host:

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 dav/ directory (and to db/, of course).

Under Windows XP, the Subversion server sometimes seems to send out corrupted data. Can this really be happening?

You need to install Window XP Service Pack 1. You can get all sorts of information about that Service Pack here:

What is the best method of doing a network trace of the conversation between a Subversion client and server?

Use Ethereal to eavesdrop on the conversation:

  1. Pull down the Capture menu, and choose Start.
  2. Type port 80 for Filter, and turn off promiscuous mode.
  3. Run your Subversion client.
  4. Hit Stop (probably in a little box). Now you have a capture. It looks like a huge list of lines.
  5. Click on the Protocol column to sort.
  6. Then, click on the first relevant TCP line to select it.
  7. Right click, and choose Follow TCP Stream. You'll be presented with the request/response pairs of the Subversion client's HTTP conversion.
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).

Alternatively, if you have an up-to-date client (more recent than the 0.16 tarball) you may set the neon-debug-mask parameter in your servers configuration file to cause neon's debugging output to appear when you run the svn client. The numeric value of neon-debug-mask is a combination of the NE_DBG_... values in the header file ne_utils.h. For neon 0.23.7 setting neon-debug-mask to 130 (i.e. NE_DBG_HTTP+NE_DBG_HTTPBODY) will cause the HTTP data to be shown.

You may well want to disable compression when doing a network trace, see the compression parameter in the config configuration file.

Why does the svn revert require an explicit target? Why is it not recursive by default? These behaviors differ from almost all the other subcommands.

The short answer: it's for your own good.

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.

Making the svn revert command require an explicit target—even if that target is just '.'—is one way of accomplishing that. This requirement (as well as requiring you to supply the --recursive (-R) 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.

When I start Apache, mod_dav_svn complains about a "bad database version", that it found db-3.X, rather than db-4.X.

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.

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".

I'm getting "Function not implemented" errors on RedHat 9, and nothing works. How do I fix this?

This is not really a problem with Subversion, but it often affects Subversion users.

RedHat 9 ships with a Berkeley DB library that relies on the kernel support for NPTL (the Native Posix Threads Library).

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:

svn: Berkeley DB error
svn: Berkeley DB error while creating environment for filesystem tester/db:
Function not implemented
This can be fixed in one of several ways:

Why does SVN log say "(no author)" for files committed or imported via Apache (ra_dav)?

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:

$ svn log
------------------------------------------------------------------------
rev 24:  (no author) | 2003-07-29 19:28:35 +0200 (Tue, 29 Jul 2003)

See the Subversion Book ("Networking a Repository") to learn about configuring access restrictions in Apache.

I'm getting occasional "Access Denied" errors on Windows. They seem to happen at random. Why?

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 here, and a workaround that may reduce the incidence rate for you is available here.


Developer questions:

How do I run the regression tests in a ram disk?

See http://www.contactor.se/~dast/svn/archive-2003-02/0068.shtml.


References:

What are all the HTTP methods Subversion uses?

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:

From: Nuutti Kotivuori <naked@iki.fi>
Subject: Re: list of HTTP messages used by svn?
To: "Hamilton Link" <helink@sandia.gov>
Cc: dev@subversion.tigris.org
Date: Sat, 10 Aug 2002 13:51:52 +0300

Hamilton Link wrote:
> Is there a full list of the HTTP methods svn uses somewhere, that
> someone could piont me to? From the documentation I can find (in
> particular project_faq.html and INSTALL), the list of methods svn
> uses include at least the following:
>
> GET, PROPFIND, REPORT, OPTIONS, MERGE, MKACTIVITY, and CHECKOUT
>
> But since the lists I can find are only partial lists and nowhere
> does it suggest these are all the ones used, I'm reluctant to make
> any assumptions.
>
> If I had a complete list, I could go to the corp. proxy guy once
> instead of many times, and reduce the risk of pissing him off and
> being left with inadequate svn support in the proxy.

http://www.webdav.org/deltav/WWW10/deltav-intro.htm

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.

What's a 'bikeshed'?

See Poul-Henning Kamp's post to freebsd-hackers: http://www.freebsd.org/doc/en_US.ISO8859-1/books/faq/misc.html#BIKESHED-PAINTING.

What's a 'baton'?

Throughout subversion's source code there are many references to 'baton' objects. These are just

void *
datastructures that provide context to a function. In other APIs, they're often called
void *ctx
or
void *userdata
. Subversion developers call the structures "batons" because they're passed around quite a bit.