Som vi nevnte tidligere, er depotet som en tidsmaskin. Det lagrer alle forandringene som er lagt inn, og tillater deg å utforske denne historien ved å studere tidligere versjoner av filer og kataloger så vel som metadataene som tilhører dem. Med en enkel Subversionkommando kan du hente ut depotet (eller hente tilbake en eksisterende arbeidskopi) nøyaktig som den var på en vilkårlig dato eller revisjon i fortiden. Men noen ganger vil du bare kikke inn i fortiden istedenfor å reise til fortiden.
Det er flere kommandoer som kan gi deg historiske data fra depotet:
Viser deg bred informasjon: Loggmeldinger med dato- og forfatterinformasjon for revisjonene og hvilke stier som forandret seg i hver revisjon.
Viser deg de spesifikke detaljene om hvordan ei fil forandret seg over tid.
Denne blir brukt til å hente en vilkårlig fil som den var da den eksisterte i en spesiell revisjon og vise den på skjermen.
List filene i katalogen for en vilkårlig revisjon.
For å finne informasjon om historien til ei fil eller katalog, bruk kommandoen svn log. svn log vil gi deg en oversikt over hvem som gjorde forandringer i ei fil eller en katalog, i hvilken revisjon den forandret seg, tid og dato for denne revisjonen, og, hvis den ble skrevet, loggmeldingen som hører til innleggingen.
$ svn log ------------------------------------------------------------------------ r3 | sally | man, 15 jul 2002 18:03:46 -0500 | 1 line La til include-linjer og ordnet antall osteskiver. ------------------------------------------------------------------------ r2 | harry | man, 15 jul 2002 17:47:57 -0500 | 1 line La til main()-metoder. ------------------------------------------------------------------------ r1 | sally | man, 15 jul 2002 17:40:08 -0500 | 1 line Innledende import ------------------------------------------------------------------------
Legg merke til at loggmeldinger listes ut i
omvendt kronologisk rekkefølge som
standard.
Hvis du ønsker å se et annet område av revisjoner i en spesiell
rekkefølge, eller bare en enkelt revisjon, bruk
--revision (-r)-valget:
$ svn log --revision 5:19 # viser loggene 5 til 19 i kronologisk
# rekkefølge
$ svn log -r 19:5 # viser loggene 5 til 19 i omvendt
# rekkefølge
$ svn log -r 8 # viser loggen for revisjon 8
Du kan også undersøke logghistorien for ei enkelt fil eller katalog. For eksempel:
$ svn log foo.c … $ svn log http://foo.com/svn/trunk/code/foo.c …
Dette vil vise loggmeldinger bare for de revisjonene der arbeidsfila (eller URLen) forandret seg.
Hvis du vil ha enda mer informasjon om ei fil eller en
katalog, tar svn log også et
--verbose (-v)-valg.
Fordi Subversion tillater deg å flytte og kopiere filer og
kataloger, er det viktig å ha muligheten til å følge
stiforandringer i filsystemet, så i “verbose”-modus
vil svn log inkludere en liste over
forandrede stier for en revision i listeformatet:
$ svn log -r 8 -v ------------------------------------------------------------------------ r8 | sally | 2002-07-14 08:15:29 -0500 | 1 line Changed paths: M /trunk/code/foo.c M /trunk/code/bar.h A /trunk/code/doc/README Frozzled the sub-space winch. ------------------------------------------------------------------------
svn log tar også et
--quiet-parameter (-q) som lar
være å skrive ut kroppen på loggmeldinga.
Når det kombineres med --verbose lister det kun
navnet på filene som har forandret seg.
Vi har allerede sett svn diff før – den viser filforskjeller i unified diff-format; den ble brukt til å vise de lokale forandringene i en arbeidskopi før de ble lagt inn i depotet.
Faktisk skal det vise seg at det er tre distinkte bruksmåter for svn diff:
Undersøke lokale forandringer
Sammenligne arbeidskopien din med depotet
Sammenligne depot med depot
Som vi har sett, vil det å utføre svn
diff uten noen valg sammenligne arbeidsfilene dine
med de lagrede “urørte” kopiene i
.svn-området:
$ svn diff Index: rules.txt =================================================================== --- rules.txt (revisjon 3) +++ rules.txt (arbeidskopi) @@ -1,4 +1,5 @@ Vær snill med andre Frihet = ansvar Alt med måte -Tygg med munnen åpen +Tygg med munnen lukket +Hør etter når andre prater $
Hvis et enkelt nummer blir gitt til
--revision (-r)-valget, vil
arbeidskopien bli sammenlignet med den spesifiserte revisjonen
i depotet.
$ svn diff --revision 3 rules.txt Index: rules.txt =================================================================== --- rules.txt (revisjon 3) +++ rules.txt (arbeidskopi) @@ -1,4 +1,5 @@ Vær snill med andre Frihet = ansvar Alt med måte -Tygg med munnen åpen +Tygg med munnen lukket +Hør etter når andre prater $
Hvis to revisjonsnumre, separert med kolon, blir gitt til
--revision (-r), blir disse
to revisjonene sammenlignet direkte.
$ svn diff --revision 2:3 rules.txt Index: rules.txt =================================================================== --- rules.txt (revisjon 2) +++ rules.txt (revisjon 3) @@ -1,4 +1,4 @@ Vær snill med andre -Frihet = sjokoladeis +Frihet = ansvar Alt med måte Tygg med munnen åpen $
Ikke bare kan du bruke svn diff til å sammenligne filer i arbeidskopien din mot depotet, men hvis du oppgir en URL kan du undersøke forskjellene mellom elementer i depotet uten å en gang ha en arbeidskopi. Dette er spesielt nyttig hvis du ønsker å inspisere forandringer i ei fil når du ikke har en arbeidskopi på den lokale maskinen din:
$ svn diff --revision 4:5 http://svn.red-bean.com/repos/example/trunk/text/rules.txt … $
Hvis du vil undersøke en tidligere versjon av ei fil og ikke nødvendigvis forskjellene mellom to filer, kan du bruke svn cat:
$ svn cat --revision 2 rules.txt Vær snill med andre Frihet = sjokoladeis Alt med måte Tygg med munnen åpen $
Du kan også omdirigere utdataene direkte til ei fil:
$ svn cat --revision 2 rules.txt > rules.txt.v2 $
Du lurer sikkert på hvorfor vi rett og slett ikke bare bruker svn update --revision for å oppdatere fila til den eldre revisjonen. Det er et par grunner til at vi kanskje foretrekker å bruke svn cat.
For det første kan det hende at du ønsker å se på forskjellene mellom to revisjoner av ei fil ved å bruke et eksternt diffprogram (kanskje et grafisk et, eller kanskje fila di er i et format som gjør at unified diff-formatet ikke strekker til). I dette tilfellet må du hente en kopi av den gamle revisjonen, omdirigere den til ei fil, og angi både den og fila i arbeidskopien til det eksterne diffprogrammet.
For det andre er det noen ganger rett og slett lettere å se på en eldre versjon av en fil i sin helhet i stedet for bare å se på forskjellene mellom den og en annen revisjon.
svn list-kommandoen viser deg hvilke filer som er i en depotkatalog uten å hente filene til din lokale maskin:
$ svn list http://svn.collab.net/repos/svn README branches/ clients/ tags/ trunk/
Hvis du vil ha en mer detaljert liste, angi
--verbose (-v)-flagget for å
få en liste som dette:
$ 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/
Kolonnene viser deg revisjonen fila eller katalogen sist ble modifisert, brukeren som gjorde det, størrelsen hvis det er ei fil, datoen den sist ble forandret, og elementets navn.
I tillegg til alle de ovennevnte kommandoene, kan du bruke
svn update og svn checkout
med --revision-valget for å ta en hel
arbeidskopi “tilbake i tid”[7]:
$ svn checkout --revision 1729 # Henter ut en ny arbeidskopi fra r1729
…
$ svn update --revision 1729 # Oppdaterer en eksisterende arbeidskopi
# til r1729
…