If the start-commit hook program returns a non-zero exit value, the commit is stopped beforethe commit transaction is even created, and anything printed to stderr is marshalled back toth
Trang 1Used in conjunction with the tunneloption; tells svnserve to assume thatNAMEis theauthenticated user, rather than the UID of the svnserve process Useful for users wishing
to share a single system account over SSH, but maintaining separate commit identities. threads(-T)
When running in daemon mode, causes svnserve to spawn a thread instead of a process for each connection (e.g for when running on Windows) The svnserve process still back-
grounds itself at startup time
listen-once(-X)
Causes svnserve to accept one connection on the svn port, serve it, and exit This option
is mainly useful for debugging
svnversion
309
Trang 2svnversion is a program for summarizing the revision mixture of a working copy The resultant
revision number, or revision range, is written to standard output
It's common to use this output in your build process when defining the version number of yourprogram
TRAIL_URL, if present, is the trailing portion of the URL used to determine if WC_PATHitself isswitched (detection of switches withinWC_PATHdoes not rely onTRAIL_URL).
When WC_PATH is not defined, the current directory will be used as the working copy path
TRAIL_URLcannot be defined ifWC_PATHis not explicitly given
Trang 3For a mixed-revision working copy, the range of revisions present is printed:
If invoked on a directory that is not a working copy, svnversion assumes it is an exported
working copy and prints "exported":
$ svnversion
exported
mod_dav_svn
311
Trang 4DAV svn
This directive must be included in any Directory or Location block for a Subversionrepository It tells httpd to use the Subversion backend for mod_dav to handle all requests.SVNAutoversioning On
This directive allows write requests from WebDAV clients to result in automatic commits Ageneric log message is auto-generated and attached to each revision If you enableAutoversioning, you'll likely want to setModMimeUsePathInfo Onso thatmod_mimecansetsvn:mime-typeto the correct mime-type automatically (as best asmod_mimeis able
to, of course) For more information, see Appendix C, WebDAV and Autoversioning
SVNPath
This directive specifies the location in the filesystem for a Subversion repository's files In aconfiguration block for a Subversion repository, either this directive or SVNParentPathmust be present, but not both
SVNSpecialURI
Specifies the URI component (namespace) for special Subversion resources The default
is “!svn”, and most administrators will never use this directive Only set this if there is apressing need to have a file named!svnin your repository If you change this on a serveralready in use, it will break all of the outstanding working copies and your users will huntyou down with pitchforks and flaming torches
SVNPathAuthz
Control path-based authorization by enabling or disabling subrequests See the sectioncalled “Disabling Path-based Checks” for details
312
Trang 51 As of this writing, symbolic links are indeed the only “special” objects But there might be more in future releases of Subversion.
Subversion allows users to invent arbitrarily-named versioned properties on files and ies, as well as unversioned properties on revisions The only restriction is on properties whosenames begin withsvn:(those are reserved for Subversion's own use) While these propertiesmay be set by users to control Subversion's behavior, users may not invent newsvn:proper-ties
svn:ignore
If present on a directory, the value is a list of unversioned file patterns to be ignored by svn
status and other subcommands See the section called “Ignoring Unversioned Items”
Trang 6Contains the UTC time the revision was created, in ISO 8601 format The value comes
from the server machine's clock, not the client's.
Trang 7start-commit — Notification of the beginning of a commit
Description
The start-commit hook is run before the commit transaction is even created It is typically used
to decide if the user has commit privileges at all
If the start-commit hook program returns a non-zero exit value, the commit is stopped beforethe commit transaction is even created, and anything printed to stderr is marshalled back tothe client
Trang 8et number from the bug tracker, or that the incoming log message is non-empty).
If the pre-commit hook program returns a non-zero exit value, the commit is aborted, the mit transaction is removed, and anything printed to stderr is marshalled back to the client
Trang 9The output from, and exit value returned by the post-commit hook program are ignored.
Trang 10If the pre-revprop-change hook doesn't exist, isn't executable, or returns a non-zero exit value,
no change to the property will be made, and anything printed to stderr is marshalled back tothe client
Input Parameter(s)
The command-line arguments passed to the hook program, in order, are:
1 repository path
2 revision whose property is about to be modified
3 authenticated username attempting the propchange
4 name of the property changed
5 change description:A(added),D(deleted), orM(modified)
Additionally, Subversion passes to the hook program via standard input the proposed value ofthe property
Common Uses
access control, change validation and control
318
Trang 11prop-The output from, and exit value returned by, the post-revprop-change hook program are nored.
ig-Input Parameter(s)
The command-line arguments passed to the hook program, in order, are:
1 repository path
2 revision whose property was modified
3 authenticated username of the person making the change
4 name of the property changed
5 change description:A(added),D(deleted), orM(modified)
Additionally, Subversion passes to the hook program, via standard input, the previous value ofthe property
Common Uses
propchange notification
319
Trang 12to lock particular paths If the hook notices a pre-existing lock, then it can also decide whether
a user is allowed to “steal” the existing lock
If the pre-lock hook program returns a non-zero exit value, the lock action is aborted and thing printed to stderr is marshalled back to the client
any-Input Parameter(s)
The command-line arguments passed to the hook program, in order, are:
1 repository path
2 versioned path which is to be locked
3 authenticated username of the person attempting the lock
Common Uses
access control
320
Trang 132 authenticated username of the person who locked the paths
Additionally, the list of paths locked is passed to the hook program via standard input, one pathper line
Common Uses
lock notification
321
Trang 14be decided and enforced by the hook.
If the pre-unlock hook program returns a non-zero exit value, the unlock action is aborted andanything printed to stderr is marshalled back to the client
Input Parameter(s)
The command-line arguments passed to the hook program, in order, are:
1 repository path
2 versioned path which is to be locked
3 authenticated username of the person attempting the lock
Common Uses
access control
322
Trang 152 authenticated username of the person who unlocked the paths
Additionally, the list of paths unlocked is passed to the hook program via standard input, onepath per line
Common Uses
unlock notification
323
Trang 161 Note that the URL checked out in the example above ends not with svn , but with a subdirectory thereof called
trunk See our discussion of Subversion's branching and tagging model for the reasoning behind this.
If you're eager to get Subversion up and running (and you enjoy learning by experimentation),this chapter will show you how to create a repository, import code, and then check it back outagain as a working copy Along the way, we give links to the relevant chapters of this book
If you're new to the entire concept of version control or to the “copy-modify-merge”
model used by both CVS and Subversion, then you should read Chapter 1,
Funda-mental Concepts before going any further.
Installing Subversion
Subversion is built on a portability layer called APR—the Apache Portable Runtime library TheAPR library provides all the interfaces that Subversion needs to function on different operatingsystems: disk access, network access, memory management, and so on While Subversion is
able to use Apache as one of its network server programs, its dependence on APR does not
mean that Apache is a required component APR is a standalone library useable by any ation It does mean, however, that like Apache, Subversion clients and servers run on any op-erating system that the Apache httpd server runs on: Windows, Linux, all flavors of BSD, Mac
applic-OS X, Netware, and others
The easiest way to get Subversion is to download a binary package built for your operatingsystem Subversion's website (http://subversion.tigris.org) often has these packages availablefor download, posted by volunteers The site usually contains graphical installer packages forusers of Microsoft operating systems If you run a Unix-like operating system, you can useyour system's native package distribution system (RPMs, DEBs, the ports tree, etc.) to getSubversion
Alternately, you can build Subversion directly from source code, though it's not always an easytask (If you're not experienced at building open source software packages, you're probablybetter off downloading a binary distribution instead!) From the Subversion website, downloadthe latest source-code release After unpacking it, follow the instructions in theINSTALLfile tobuild it Note that a released source package may not contain everything you need to build acommand-line client capable of talking to a remote repository Starting with Subversion 1.4 andlater, the libraries Subversion depends on (apr, apr-util, and neon) are distributed in a separatesource package suffixed with-deps These libraries are now common enough that they mayalready be installed on your system If not, you'll need to unpack the dependency package intothe same directory where you unpacked the main Subversion source Regardless, it's possiblethat you may want to fetch other optional dependencies such as Berkeley DB and possiblyApache httpd If you want to do a complete build, make sure you have all of the packages doc-umented in theINSTALLfile
If you're one of those folks that likes to use bleeding-edge software, you can also get the version source code from the Subversion repository in which it lives Obviously, you'll need toalready have a Subversion client on hand to do this But once you do, you can check out aworking copy of the Subversion source repository from http://svn.collab.net/repos/svn/trunk/:1
Sub-324
Trang 17The examples used in this appendix assume that you have svn, the Subversion command-line client, and svnadmin, the administrative tool, ready to go on a
Unix-like operating system (This tutorial also works at the Windows commandlineprompt, assuming you make some obvious tweaks.) We also assume you are us-
ing Subversion 1.2 or later (run svn version to check.)
Subversion stores all versioned data in a central repository To begin, create a new repository:
$ svnadmin create /path/to/repos
$ ls /path/to/repos
conf/ dav/ db/ format hooks/ locks/ README.txt
This command creates a new directory/path/to/reposwhich contains a Subversion itory This new directory contains (among other things) a collection of database files You won'tsee your versioned files if you peek inside For more information about repository creation and
repos-maintenance, see Chapter 5, Repository Administration.
Subversion has no concept of a “project” The repository is just a virtual versioned filesystem, alarge tree that can hold anything you wish Some administrators prefer to store only oneproject in a repository, and others prefer to store multiple projects in a repository by placingthem into separate directories The merits of each approach are discussed in the section called
“Planning Your Repository Organization” Either way, the repository only manages files anddirectories, so it's up to humans to interpret particular directories as “projects” So while youmight see references to projects throughout this book, keep in mind that we're only ever talkingabout some directory (or collection of directories) in the repository
In this example, we assume that you already have some sort of project (a collection of files anddirectories) that you wish to import into your newly created Subversion repository Begin by or-
325
Trang 18ons that will be clear later (see Chapter 4, Branching and Merging), your project's tree
struc-ture should contain three top-level directories named branches, tags, and trunk The
trunk directory should contain all of your data, while branches and tags directories are
…
The branches, tags, and trunk subdirectories aren't actually required by Subversion
They're merely a popular convention that you'll most likely want to use later on
Once you have your tree of data ready to go, import it into the repository with the svn import
command (see the section called “Getting Data into your Repository”):
$ svn import /tmp/myproject file:///path/to/repos/myproject -m "initial import"
Now the repository contains this tree of data As mentioned earlier, you won't see your files by
directly peeking into the repository; they're all stored within a database But the repository's
imaginary filesystem now contains a top-level directory namedmyproject, which in turn
con-tains your data
Note that the original/tmp/myprojectdirectory is unchanged; Subversion is unaware of it
(In fact, you can even delete that directory if you wish.) In order to start manipulating repository
data, you need to create a new “working copy” of the data, a sort of private workspace Ask
Subversion to “check out” a working copy of the myproject/trunkdirectory in the
Checked out revision 1
Now you have a personal copy of part of the repository in a new directory namedmyproject
You can edit the files in your working copy and then commit those changes back into the
re-pository
• Enter your working copy and edit a file's contents
326
Trang 19• Run svn commit to commit the new version of your file to the repository.
• Run svn update to bring your working copy “up-to-date” with the repository.
For a full tour of all the things you can do with your working copy, read Chapter 2, Basic
Usage.
At this point, you have the option of making your repository available to others over a network
See Chapter 6, Server Configuration to learn about the different sorts of server processes
available and how to configure them
327
Trang 20references to relevant chapters when possible.
Although the goal of Subversion is to take over the current and future CVS user base, somenew features and design changes were required to fix certain “broken” behaviors that CVShad This means that, as a CVS user, you may need to break habits—ones that you forgotwere odd to begin with
Revision Numbers Are Different Now
In CVS, revision numbers are per-file This is because CVS stores its data in RCS files; eachfile has a corresponding RCS file in the repository, and the repository is roughly laid out ac-cording to the structure of your project tree
In Subversion, the repository looks like a single filesystem Each commit results in an entirelynew filesystem tree; in essence, the repository is an array of trees Each of these trees islabeled with a single revision number When someone talks about “revision 54”, they're talkingabout a particular tree (and indirectly, the way the filesystem looked after the 54th commit).Technically, it's not valid to talk about “revision 5 offoo.c” Instead, one would say “foo.cas
it appears in revision 5” Also, be careful when making assumptions about the evolution of afile In CVS, revisions 5 and 6 offoo.care always different In Subversion, it's most likely thatfoo.cdid not change between revisions 5 and 6.
Similarly, in CVS a tag or branch is an annotation on the file, or on the version information forthat individual file, whereas in Subversion a tag or branch is a copy of an entire tree (by con-vention, into the/branchesor/tagsdirectories that appear at the top level of the repository,beside /trunk) In the repository as a whole, many versions of each file may be visible: thelatest version on each branch, every tagged version, and of course the latest version on thetrunk itself So, to refine the terms even further, one would often say “foo.cas it appears in/branches/REL1in revision 5.”
For more details on this topic, see the section called “Revisions”
Directory Versions
Subversion tracks tree structures, not just file contents It's one of the biggest reasons sion was written to replace CVS
Subver-Here's what this means to you, as a former CVS user:
• The svn add and svn delete commands work on directories now, just as they work on files.
So do svn copy and svn move However, these commands do not cause any kind of
imme-diate change in the repository Instead, the working items are simply “scheduled” for addition
or deletion No repository changes happen until you run svn commit.
• Directories aren't dumb containers anymore; they have revision numbers like files (Or moreproperly, it's correct to talk about “directoryfoo/in revision 5”.)
328