A Crash Course in Subversion, Part 2, Page 3
Changing a Repository URL with svn switch --relocate
There's one other time you might need to use svn switch , and that's when the URL you use to access your Subversion repository has changed. This could happen if the URL has moved to another machine, the path it's located at changes, or if you switch from one repository access layer to another (say you want to stop accessing the repository directly via a file:// URL, and start accessing over a network with a http://or svn:// URL). In these situations, you use the --relocate flag with svn switch, and give it the portions of the URL you're changing. For example, if the repository was accessed via ra_local on your local machine at the path /home/repos, and you need to change to accessing it over ra_svn, because this working copy has been moved to a different machine, you do something like this:
$ svn info | grep ^URL URL:file:///home/repos/trunk $ svn switch --relocate file:///svn://servername/ $ svn info | grep ^URL URL:svn://servername/home/repos/trunk $
Note that svn switch --relocate will work only if the new URL points to the exact same repository. Each Subversion repository has its own UUID, and the client will compare the UUID for the new repository to the one from the old repository and ensure that they're the same before allowing the switch to complete.
Removing Old Branches
One more advantage of Subversion's "everything is a copy" design is that there's no need to keep old development branches around in the HEAD version of the repository. Once a branch's useful life has ended, a simple svn delete will remove it from HEAD, and users will no longer be bothered by its presence in the output of svn list commands. Of course, the branch will still exist in the history of the repository, so you can easily retrieve any of its contents later by just specifying the correct revision of the repository.
PropertiesSubversion allows you to associate arbitrary metadata with files, directories, and even revisions in the repository. Each bit of metadata, or property, consists of a name, which can be any Unicode string, and an arbitrary value, which can be anything at all. Internally, this functionality is used to implement a variety of different features of Subversion (log entries are properties associated with each revision, for example), but it's also exposed to users for their own use. You could, for example, choose to mark files with a "maintainer" property to indicate which developer is responsible for it. In addition to your own properties, Subversion reserves all properties starting with the prefix svn:for itself, and you can manipulate several properties in that namespace to control Subversion's behavior in useful ways. Before diving into those, though, let's look at the commands you need to use to work with properties.
First, you'll need a way to tell what, if any, properties have been set on a particular versioned resource. The svn proplist command, as you might expect, does that for you. Let's take a look at how it works:
$ ls -a .svn index.html button.png $ svn proplist index.html Properties on 'index.html': svn:mime-type $ svn proplist button.png Properties on 'button.png': svn:mime-type $
Here you can see a working copy that holds the contents of a web site. The files index.html and button.png both have the svn:mime-type property, which is a special property Subversion uses internally to track the mime type of a file.
Well, now you've seen what properties have been set on a particular file, but that's not very useful unless you can determine what value they've been set to. The svn propget command prints out the value of a given property for you. The syntax for the command is simple. It takes as its first argument the name of the property you're printing out, and subsequent arguments are the files it should use as targets.
$ svn propget svn:mime-type index.html text/html $ svn propget svn:mime-type button.png image/png $
As you might have guessed, index.html has the svn:mime-type of text/html, and button.png has image/png.
To make use of properties, you'll need to be able to set and change them. To do that, you'll need to use the svn propset and svn propedit commands. svn propset sets the value of a specific property on a versioned entity. You specify the property as its first argument, and then the second argument can be the value or, if you're dealing with a value that would be inconvenient to deal with on the command line, you can specify a file that holds the contents of the property via the -F filename argument. Subsequent arguments are the targets on which the property will be set.
$ svn add logo.png A (bin) logo.png $ svn commit -m "added logo.png" Adding (bin)web/logo.png Transmitting file data . Committed revision 35. $ svn propget svn:mime-type logo.png application/octet-stream $ svn propset svn:mime-type image/png logo.png property 'svn:mime-type'set on 'logo.png' $ svn status M logo.png $svn propget svn:mime-type logo.png image/png $ svn commit -m "set mime-type on logo.png to image/png" Sending web/logo.png Committed revision 36. $
Note that the mime type of logo.png was set to application/octet-stream when you first added it. This is the default behavior when Subversion determines that the file isn't plain text, and it will prevent Subversion from doing things like end-of-line conversion or keyword substitution, which would be destructive when applied to a binary file. It also keeps Subversion from attempting to display textual diffs in the output of svn diff or from automatically merging in changes during svn update, both of which aren't possible with binary files. Later, when you set the svn:mime-type to image/png, you'll see yet another new kind of output from svn status. The M in the second column of the output indicates that the file's properties have been modified. Also note that you had to commit the change back to the repository, because like most other things in Subversion, properties that are set on files and directories are versioned.
Similar to svn propset is svn propedit, which allows you to edit the contents of a property in your default text editor. Let's take a look at how this works.
$ svn proplist . Properties on '': svn:ignore $ svn propget svn:ignore . *~ .*~ $ svn propedit svn:ignore . [ editor pops up with contents of svn:ignore in it. we edit it,save,and exit ] $ svn status M . $svn diff Property changes on: ___________________________________________________________________ Name:svn:ignore -*~ .*~ +*~ .*~ .DS_Store $ svn commit -m "added .DS_store to svn:ignore" Sending . Committed revision 50. $
This example shows how you can use svn propedit to edit the svn:ignore property. Also note that the svn diff command shows you the changes you make to properties as well as to the contents of files. Don't focus too much on the specifics of the value of the svn:ignore property (I'll discuss that in a minute)—just remember that the svn propedit command allows you to modify a property with an editor and that svn diff will show you the difference once you do.
As you can see by the long help message for svn propset, Subversion has several special properties, some of which you've already seen. You can set these special properties on your files and directories to control Subversion's behavior in certain ways, as shown in Table 2-3.
Table 2-3. Special Properties
|svn:ignore||Indicates which files in a directory should be ignored by svn status|
|svn:keywords||Indicates which RCS style keywords should be expanded in a given file|
|svn:executable||Indicates that a given file should be made executable, if such a thing is possible on the operating system in question|
|svn:eol-style||Indicates what style line endings should be used for a given textual file|
|svn:mime-type||Indicates what mime type should be used when a given file is served from a mod_dav_svn enabled Apache server|
|svn:externals||Lists directories within a given directory that should be retrieved from alternate URLs|