3.6 Examining History

As we mentioned earlier, the repository is like a time machine. It keeps a record of every change ever committed, and allows you to explore this history by examining previous versions of files and directories, as well as the metadata that accompanies them. With a single Subversion command, you can check out the repository (or restore an existing working copy) exactly as it was at any date or revision number in the past. However, sometimes you just want to "peer into" the past instead of "going into" the past.

There are several commands that can provide you with historical data from the repository:


svn log

Shows you broad information: log messages attached to revisions, and which paths changed in each revision.


svn diff

Shows you the specific details of how a file changed over time.


svn cat

Used to retrieve any file as it existed in a particular revision number and display it on your screen.


svn list

Displays the files in a directory for any given revision.

3.6.1 svn log

To find out information about the history of a file or directory, use the svn log command. svn log will provide you with a record of who made changes to a file or directory, at what revision it changed, the time and date of that revision, and, if it was provided, the log message that accompanied the commit.

$ svn log ------------------------------------------------------------------------ r3 | sally | Mon, 15 Jul 2002 18:03:46 -0500 | 1 line Added include lines and corrected # of cheese slices. ------------------------------------------------------------------------ r2 | harry | Mon, 15 Jul 2002 17:47:57 -0500 | 1 line Added main( ) methods. ------------------------------------------------------------------------ r1 | sally | Mon, 15 Jul 2002 17:40:08 -0500 | 1 line Initial import ------------------------------------------------------------------------

Note that the log messages are printed in reverse chronological order by default. If you wish to see a different range of revisions in a particular order, or just a single revision, use the --revision (-r) switch:

$ svn log --revision 5:19    # shows logs 5 through 19 in chronological order $ svn log -r 19:5            # shows logs 5 through 19 in reverse order $ svn log -r 8               # shows log for revision 8

You can also examine the log history of a single file or directory. For example:

$ svn log foo.c ... $ svn log http://foo.com/svn/trunk/code/foo.c ...

These display log messages only for those revisions in which the working file (or URL) changed.

If you want even more information about a file or directory, svn log also takes a --verbose (-v) switch. Because Subversion allows you to move and copy files and directories, it is important to be able to track path changes in the filesystem, so in verbose mode, svn log will include a list of changed paths in a revision in its output:

$ svn log -r 8 -v ------------------------------------------------------------------------ r8 | sally | 2002-07-14 08:15:29 -0500 | 1 line Changed paths: U /trunk/code/foo.c U /trunk/code/bar.h A /trunk/code/doc/README Frozzled the sub-space winch. ------------------------------------------------------------------------

Why Does svn log Give Me an Empty Response?

After working with Subversion for a bit, most users will come across something like this:

$ svn log -r 2 ------------------------------------------------------------------------ $

At first glance, this seems like an error. But recall that while revisions are repository-wide, svn log operates on a path in the repository. If you supply no path, Subversion uses the current working directory as the default target. As a result, if you're operating in a subdirectory of your working copy and attempt to log a revision in which neither that directory nor any of its children was changed, Subversion will give you an empty log. If you want to see what changed in that revision, try pointing svn log directly at the top-most URL of your repository, as in svn log -r 2 http://svn.collab.net/repos/svn.


3.6.2 svn diff

We've already seen svn diff before it displays file differences in unified diff format, and it was used to show the local modifications made to our working copy before committing to the repository.

In fact, it turns out that there are three distinct uses of svn diff:

  • Examine local changes

  • Compare your working copy to the repository

  • Compare repository to repository

3.6.2.1 Examining local changes

As we've seen, invoking svn diff with no switches will compare your working files to the cached pristine copies in the.svn area:

$ svn diff Index: rules.txt = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = --- rules.txt        (revision 3) +++ rules.txt        (working copy) @@ -1,4 +1,5 @@  Be kind to others  Freedom = Responsibility  Everything in moderation -Chew with your mouth open +Chew with your mouth closed +Listen when others are speaking $

3.6.2.2 Comparing working copy to repository

If a single --revision (-r) number is passed, then your working copy is compared to the specified revision in the repository.

$ svn diff --revision 3 rules.txt  Index: rules.txt = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = --- rules.txt        (revision 3) +++ rules.txt        (working copy) @@ -1,4 +1,5 @@  Be kind to others  Freedom = Responsibility  Everything in moderation -Chew with your mouth open +Chew with your mouth closed +Listen when others are speaking $

3.6.2.3 Comparing repository to repository

If two revision numbers, separated by a colon, are passed via --revision (-r), then the two revisions are directly compared.

$ svn diff --revision 2:3 rules.txt  Index: rules.txt = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = --- rules.txt        (revision 2) +++ rules.txt        (revision 3) @@ -1,4 +1,4 @@  Be kind to others -Freedom = Chocolate Ice Cream +Freedom = Responsibility  Everything in moderation  Chew with your mouth closed  $

Not only can you use svn diff to compare files in your working copy to the repository, but if you supply a URL argument, you can examine the differences between items in the repository without even having a working copy. This is especially useful if you wish to inspect changes in a file when you don't have a working copy on your local machine:

$ svn diff --revision 4:5 http://svn.red-bean.com/repos/example/trunk/text/rules.txt ... $

3.6.3 svn cat

If you want to examine an earlier version of a file and not necessarily the differences between two files, you can use svn cat:

$ svn cat --revision 2 rules.txt  Be kind to others Freedom = Chocolate Ice Cream Everything in moderation Chew with your mouth closed $

You can also redirect the output directly into a file:

$ svn cat --revision 2 rules.txt > rules.txt.v2 $

You're probably wondering why we don't just use svn update revision to update the file to the older revision. There are a few reasons why we might prefer to use svn cat.

First, you may want to see the differences between two revisions of a file using an external diff program (perhaps a graphical one, or perhaps your file is in such a format that the output of unified diff is nonsensical). In this case, you'll need to grab a copy of the old revision, redirect it to a file, and pass both that and the file in your working copy to your external diff program.

Sometimes it's easier to look at an older version of a file in its entirety as opposed to only the differences between it and another revision.

3.6.4 svn list

The svn list command shows you what files are in a repository directory without actually downloading the files to your local machine:

$ svn list http://svn.collab.net/repos/svn README branches/ clients/ tags/ trunk/

If you want a more detailed listing, pass the --verbose (-v) flag to get output like this:

$ svn list --verbose http://svn.collab.net/repos/svn    2755 harry          1331 Jul 28 02:07 README    2773 sally               Jul 29 15:07 branches/    2769 sally               Jul 29 12:07 clients/    2698 harry               Jul 24 18:07 tags/    2785 sally               Jul 29 19:07 trunk/

The columns tell you the revision at which the file or directory was last modified, the user who modified it, the size (if it is a file), the date it was last modified, and the item's name.

3.6.5 A Final Word on History

In addition to all of the previous commands, you can use svn update and svn checkout with the --revision switch to take an entire working copy back in time. (See? We told you that Subversion was a time machine.)

$ svn checkout --revision 1729 # Checks out a new working copy at r1729 ... $ svn update --revision 1729 # Updates an existing working copy to r1729 ...



Version Control with Subversion
Version Control with Subversion
ISBN: 0596510330
EAN: 2147483647
Year: 2003
Pages: 127

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net