Studere historien

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:

svn log

Viser deg bred informasjon: Loggmeldinger med dato- og forfatterinformasjon for revisjonene og hvilke stier som forandret seg i hver revisjon.

svn diff

Viser deg de spesifikke detaljene om hvordan ei fil forandret seg over tid.

svn cat

Denne blir brukt til å hente en vilkårlig fil som den var da den eksisterte i en spesiell revisjon og vise den på skjermen.

svn list

List filene i katalogen for en vilkårlig revisjon.

svn log

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.

svn diff

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

Undersøke lokale forandringer

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
$

Sammenligne arbeidskopi med depot

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
$

Sammenligne depot med depot

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
…
$

svn cat

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

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.

Et siste ord om historie

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
…


[7] Ser du? Vi sa jo at Subversion er en tidsmaskin.