| <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 line 38: Unterminated `s' 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 80</tt>" to |
| "<tt>Listen 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 <sussman@collab.net>): |
| |
| <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 <peter@pdavis.cx> 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 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 dump /path/to/repository > dumpfile.txt</tt> |
| </b>, |
| using version X of svnadmin. |
| </li> |
| |
| <li> |
| <b> |
| <tt>mv /path/to/repository /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 create /path/to/repository</tt></b>, using version |
| Y of svnadmin. |
| </li> |
| |
| <li> |
| <b> |
| <tt>svnadmin load /path/to/repository < 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" >>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 line 38: Unterminated `s' 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—even if that target is just '.'—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: (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><Location |
| /www/foo></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><Location></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 <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. |
| |
| <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> |
| |