Revision Specifiers

As you saw in “Tidsreiser med Subversion”, revision numbers in Subversion are pretty straightforward—integers that keep getting larger as you commit more changes to your versioned data. Still, it doesn't take long before you can no longer remember exactly what happened in each and every revision. Fortunately, the typical Subversion workflow doesn't often demand that you supply arbitrary revisions to the Subversion operations you perform. For operations that do require a revision specifier, you generally supply a revision number that you saw in a commit email, in the output of some other Subversion operation, or in some other context that would yield meaning to that particular number.

But occasionally, you need to pinpoint a moment in time for which you don't already have a revision number memorized or handy. So besides the integer revision numbers, svn allows as input some additional forms of revision specifiers—revision keywords, and revision dates.

Notat

The various forms of Subversion revision specifiers can be mixed and matched when used to specify revision ranges. For example, you can use -r REV1:REV2 where REV1 is a revision keyword and REV2 is a revision number, or where REV1 is a date and REV2 is a revision keyword, and so on. The individual revision specifiers are independently evaluated, so you can put whatever you want on the opposite sides of that colon.

Nøkkelord for revisjoner

Subversionklienten forstår noen revisjonsnøkkelord. Disse nøkkelordene kan bli brukt istedenfor heltallsargumenter til --revision-valget, og blir oversatt til spesifikke revisjonsnumre av Subversion:

HEAD

Den seneste (eller “yngste”) revisjonen i depotet.

BASE

Revisjonsnummeret til et element i en arbeidskopi. Hvis elementet inneholder lokale forandringer, refererer “BASE-versjonen” til det som elementet ser ut som når disse forandringene ikke er til stede.

COMMITTED

Den seneste revisjonen før eller lik BASE, der et element ble forandret.

PREV

Revisjonen like før den siste revisjonen der et element ble forandret. Teknisk sett koker dette ned til COMMITTED-1.

As can be derived from their descriptions, the PREV, BASE, and COMMITTED revision keywords are used only when referring to a working copy path—they don't apply to repository URLs. HEAD, on the other hand, can be used in conjuction with both of these path types.

Her er noen eksempler på revisjonsnøkkelord i aksjon:

$ svn diff -r PREV:COMMITTED foo.c
# viser den siste forandringen lagt inn i foo.c

$ svn log -r HEAD
# viser loggmelding for den seneste innleggingen i depotet

$ svn diff -r HEAD
# sammenligner arbeidskopien din (med alle lokale forandringer) med den 
# seneste versjonen av det treet i depotet

$ svn diff -r BASE:HEAD foo.c
# sammenligner den umodifiserte versjonen av foo.c mot den seneste 
# versjonen av foo.c i depotet

$ svn log -r BASE:HEAD
# viser alle loggmeldinger for den nåværende versjonerte katalogen siden 
# du sist oppdaterte

$ svn update -r PREV foo.c
# omgjør den nyeste forandringen i foo.c og minsker arbeidsrevisjonen 
# for foo.c

$ svn diff -r BASE:14 foo.c
# sammenligner den umodifiserte versjonen av foo.c med det foo.c var i 
# revisjon 14

Revisjonsdatoer

Revision numbers reveal nothing about the world outside the version control system, but sometimes you need to correlate a moment in real time with a moment in version history. To facilitate this, the --revision option can also accept as input date specifiers wrapped in curly braces ({ and }). Subversion accepts the standard ISO-8601 date and time formats, plus a few others. Here are some examples. (Remember to use quotes around any date that contains spaces.)

$ svn checkout -r {2006-02-17}
$ svn checkout -r {15:30}
$ svn checkout -r {15:30:00.200000}
$ svn checkout -r {"2006-02-17 15:30"}
$ svn checkout -r {"2006-02-17 15:30 +0230"}
$ svn checkout -r {2006-02-17T15:30}
$ svn checkout -r {2006-02-17T15:30Z}
$ svn checkout -r {2006-02-17T15:30-04:00}
$ svn checkout -r {20060217T1530}
$ svn checkout -r {20060217T1530Z}
$ svn checkout -r {20060217T1530-0500}
…

When you specify a date, Subversion resolves that date to the most recent revision of the repository as of that date, and then continues to operate against that resolved revision number:

$ svn log -r {2006-11-28}
------------------------------------------------------------------------
r12 | ira | 2006-11-27 12:31:51 -0600 (man, 27 nov 2006) | 6 lines
…

Du kan også bruke et område av datoer. Subversion vil finne alle revisjoner mellom to datoer, inkludert:

$ svn log -r {2006-11-20}:{2006-11-29}
…

Som vi har påpekt, kan du også blande datoer og revisjoner:

$ svn log --revision {2002-11-20}:4040

Advarsel

Siden tidspunktet på en revisjon er lagret som en uversjonert, redigerbar egenskap for revisjonen (se “Egenskaper”, kan revisjonsegenskaper bli forandret til å representere en kronologi som ikke stemmer, eller kan til og med bli fjernet helt. Dette vil rote til den interne “dato-til-revisjon”-konverteringen som Subversion utfører.