Introduksjon til CVS

Fra Wikibøker – frie læremidler
Hopp til: navigasjon, søk

Hva er CVS?[rediger]

«CVS» står for «Concurrent Versions System» og er et såkalt «versjonskontrollsystem» — et program som er i stand til å holde orden i en filstruktur, enten det er kildekode til et program, konfigurasjonsfiler eller et katalogtre. Det er det mest brukte versjonskontrollprogrammet i verden i dag, mye på grunn av at det er dekket av GNU-lisensen og dermed er fritt tilgjengelig, og det har gjennom sin historie vist seg å være meget stabilt og sikkert, selv med mange hundre utviklere som jobber parallellt med mange tusen filer. En annen grunn kan være at det er en videreutvikling av det velprøvde programmet RCS som har vært brukt siden begynnelsen av 80-tallet i forrige århundre.

Eksempler på store prosjekter som bruker CVS er GNU-prosjektet, nettleseren Mozilla, krypteringsprgrammet GnuPG, og for å bringe høna og egget-problematikken på bane, CVS sjøl. Hundrevis av forskjellige programmere oppdaterer til stadighet kildekoden uten å tråkke hverandre på tærne og dermed overlappe versjoner. Hvis en programmerer føler behov for å gjøre ting som kan påvirke stabiliteten i programmet, kan han lage sin egen «branch» (utviklingsgren) der han kan lagre egne oppdateringer uavhengig av hva de andre gjør. Vi andre kan hente ut hvilken versjon vi vil, også siste «bleeding edge» versjon tilgjengelig. Eller se på utviklingen til de forskjellige filene. Lesing av diff-filer mellom de forskjellige versjonene kan være grei underholdning på onsdagskvelder.

Filene legges inn i en database (på engelsk «repository», heretter fornorsket til «depot») med mulighet for å legge inn kommentarer om hvilke forandringer som er gjort, eller merke forskjellige utgaver av filene så forskjellige kombinasjoner av filstrukturen kan tilbakestilles til et hvilket som helst tidspunkt. Vil man se hva som er forskjellen på forskjellige versjoner, kan en «diff»-kommando kjøres og man ser hva som er forskjellig i forhold til den gamle versjonen.

Hvis det er flere som jobber på samme oppgave, kan det være vanskelig å beholde oversikten over hvem som gjør hva. Dette holder CVS også orden på, ved at hver bruker har sitt eget brukernavn og sin egen versjon av filene liggende på sin maskin og dermed kan legge inn endringer i depotet uavhengig av hva de andre har gjort. Hvis flere brukere modifiserer de samme filene samtidig, har CVS innebygget logikk for å kombinere de nye endringene såfremt forandringene er gjort i forskjellige deler av fila. Hvis begge brukerne har forandret en linje på forskjellig måte, blir man konfrontert med det og spurt spurt om hvilken foranding som skal brukes.

Mange problemer som oppstår ved vedlikehold av en filstruktur kan begrenses ved bruk av CVS:

  • Alle tidligere versjoner av filene lagres, så man kan rekonstruere filstrukturen til ethvert tidspunkt. En feil har for eksempel oppstått i et program. Når oppsto denne feilen? Hva ble gjort som lagde denne feilen? Man vet med sikkerhet at en tidligere versjon av programmet ikke hadde denne feilen, altså må feilen ha kommet inn på et visst tidspunkt. Ved å rekonstruere tidligere versjoner kan man identifisere endringene som introduserer feil.
  • Det er lett å vise hvilke forskjeller mellom to forskjellige versjoner og på den måten ha kontroll over hva som er gjort.
  • Ved å skrive inn en kommantar hver gang en versjon legges inn, får man etterhvert en bra oversikt over utviklingen.
  • Flere brukere kan jobbe ganske uavhengig av hverandre på de samme filene. Man gjør forandringer på filene og legger dem inn i CVS, og andre brukere som har tilgang til depotet vil få med seg disse oppdateringene. Dette er en god hjelp i å forhindre at dine forandringer blir annullert fordi gamle versjoner av fila blir lagt inn av de andre utviklerne. Hver bruker får et unikt brukernavn som brukes ved innlegging i CVS, dette gjør kommunikasjon og samarbeid mellom de forskjellige utviklerne lettere, og misforståelser og uklarheter blir lettere unngått.
  • Bruk av CVS forhindrer at man legger ned mye arbeid i form av editering på gammel, avlegs kildekode, men har stadig siste versjon innen rekkevidde med komplett historie for hver enkelt fil.
  • Det er mulig å lage parallelle og alternative versjoner (såkalt «branching») som det kan arbeides på uten at den stabile eller vanlige versjonen blir påvirket.

Virkemåte[rediger]

Alle forandringer/informasjon til CVS ligger lagret i depotet, en katalogstruktur som utviklerne har tilgang til. Enten ved at brukerne har lokal tilgang til denne katalogstrukturen, eller ved å sette opp en såkalt «CVS server» som brukerne kobler seg opp til via nettverket eller Internett når de vil hente filer eller legge inn forandringer.

Alle de forskjellige kildekodene blir inndelt i moduler, som egentlig er en underkatalog i depotet. Man kan velge å ha mange forskjellige prosjekter i depotet, eller hvis det er store prosjekter som er uavhengig av hverandre, lage et eget depot for hvert prosjekt. Det er ingenting i veien for å starte med ett depot og deretter splitte det opp i enkeltprosjekter på et senere tidspunkt.

La oss si at vi skal modifisere kildekoden til superedit som er et egetstående program under utvikling. En eksempelvis fremgangsmåte for å modifisere kildekoden til dette prosjektet blir da:

  1. Hente siste versjon av kildekoden med "cvs checkout superedit", eller hvis det er gjort tidligere, kjøre "cvs update" for å få med seg eventuelle nye ting som har skjedd med filene.
  2. Gjøre forandringer, for eksempel å legge til hjelpemeny i programmet.
  3. Sjekke at programmet fungerer godt nok til å lagres.
  4. Få med seg eventuelle nye forandringer i kildekoden som har skjedd i mellomtiden (cvs update). Hvis dette ikke blir gjort, og noen andre i mellomtiden har lagret en nyere versjon, vil CVS advare om at noe har skjedd siden sist, og den vil nekte å legge inn forandringene. Dette er for at forandringene til den andre utvikleren ikke skal bli annullert. Hvis noen andre har modifisert de samme filene som du nettopp har redigert, har CVS logikk for å flette inn disse modifikasjonene sammen med de som er gjort av andre. Hvis noen av de samme linjene i fila er forandret av begge brukerne, må det biologisk tenkemateriale til og CVS nøyer seg med å si fra om at det er en konflikt i de forskjellige versjonene, og de aktuelle stedene i fila blir merket. Disse kan redigeres manuelt før den legges inn.
  5. Lagre den nye, fine versjonen (cvs commit). Man blir her bedt om å skrive inn en tekst om hva de nye forandringene er. I dette tilfellet kan man skrive inn for eksempel «La til hjelpemeny og fikset passordrutinene». Dette blir lagret i en logg sammen med brukernavnet til vedkommende som utførte forandringene, og man kan eventuelt gå tilbake i loggen og lese om alle forandringer som er blitt gjort hvis man trenger det. For å få med seg alle forandringene som er gjort, er en "cvs -u diff >/tmp/forskjeller.txt" et godt hjelpemiddel for å se hvordan filen skiller seg fra den versjonen som ligger i depotet. Denne kommandoen kan kjøres før "cvs commit" for å hjelpe på oversikt og hukommelse.

Når dette er gjort, vil andre kunne skrive cvs checkout superedit (hente en ny, oppdatert versjon) eller cvs update superedit (oppdatere en allerede eksisterende versjon som man har liggende) og få siste versjon av filene som det kan hakkes i vei på.

Revisjonsnummer[rediger]

Hver ny versjon av hver fil får tildelt et «revisjonsnummer» som ikke er versjonsnummeret til programmet, men en refereranse til versjonen av den gjeldende filen. En fil som for eksempel index.c kan ha revisjonsnummer 1.34, som referer til akkurat denne versjonen av fila som ligger i depotet. Ved å legge inn ting som $Id$ i kildekoden, oppdateres dette feltet ved hver oppdatering (cvs commit) slik at istedenfor $Id$ blir det liggende ting som

$Id: cvs-intro.html,v 1.1.2.27 2003/05/04 22:08:44 sunny Exp $

i fila. Dermed vet man hvilken versjon man har foran seg, og kan jobbe ut derfra.

Kom i gang[rediger]

Sett miljøvariabler[rediger]

For å gjøre livet lettere, kan miljøvariabler (på engelsk «environment variables») settes til standardverdier så man slipper å skrive det samme om og om igjen. Hvis du vil ha depotet liggende i /home/gunvald/depot, kan du sette variabelen CVSROOT til katalogen den skal ligge i. For eksempel

export CVSROOT=/home/gunvald/depot

hvis du bruker bash. Andre variabler er:

CVSEDITOR
Editor som skal brukes når man skriver inn kommentarer under innlegging av filer. Normalt vil vi(1) sprette opp, men hvis du bruker andre editorer, kan du skrive

export CVSEDITOR=joe

hvis det er joe(1) som er favoritten.
CVS_RSH
Hvilket program som skal brukes ved kommunikasjon med CVS-serveren. Settes normalt til Secure Shell i og med at rsh(1) (Remote SHell) i stadig mindre grad blir brukt:

export CVS_RSH=ssh

Oppretting av depot[rediger]

For at du skal kunne arkivere filer, må depotet initialiseres. Hvis du vil ha den i eksempelvis /home/gunvald/depot, skriver du:

cvs -d /home/gunvald/depot init

Hvis katalogen depot/CVSROOT er blitt laget, ble depotet opprettet, og du kan begynne bruken av CVS.

Merk at dette må gjøres innlogget med tilgang til selve katalogen, forsøk på å gjøre det via CVS-serveren eller via nettet vil ikke fungere. Det vil imidlertid ikke være noe problem, i og med at dette er noe som kun gjøres en gang. Ingen av de andre utviklerne vil trenge å gjøre dette når depotet er opprettet.

Oppretting av arbeidsområde[rediger]

Vi skal nå legge inn filer. Men først trenger vi en plass å jobbe. Det som er gjort nå, er kun opprettelsen av et tomt depot uten filer. Lag deg en arbeidskatalog, for eksempel /home/gunvald/src/cvs. Gå dit og kjør

cvs -d /home/gunvald/depot co .

Noe lignende som dette skal skje:

03:31:07 gunvald@carmbb:~/src/cvs$ cvs -d /home/gunvald/depot co .
cvs checkout: Updating .
cvs checkout: Updating CVSROOT
U CVSROOT/checkoutlist
U CVSROOT/commitinfo
U CVSROOT/config
U CVSROOT/cvswrappers
U CVSROOT/editinfo
U CVSROOT/loginfo
U CVSROOT/modules
U CVSROOT/notify
U CVSROOT/rcsinfo
U CVSROOT/taginfo
U CVSROOT/verifymsg
03:31:25 gunvald@carmbb:~/src/cvs$

Strukturen er nå installert, og du kan gå i gang med å opprette kataloger og filer.

03:57:19 gunvald@carmbb:~/src/cvs$ mkdir greier
03:57:41 gunvald@carmbb:~/src/cvs$ cvs add greier
Directory /home/gunvald/depot/greier added to the repository
03:57:45 gunvald@carmbb:~/src/cvs$ cd greier/
03:57:48 gunvald@carmbb:~/src/cvs/greier$ vim fil.txt
03:58:05 gunvald@carmbb:~/src/cvs/greier$

Vi har nå i teorien laget en fil som vi vil lagre. Den består i all sin oppfinnsomhet av disse to linjene:

$Id$
Dette er en test.

Innlegging av filer skjer i to trinn i CVS:

  1. Merking av fila for lagring. Ingen forandringer blir gjort i depotet, kun en «dummy»-entry blir lagt til i CVS/Entries i katalogen du står i nå. Den vil nå bli lagt til ved neste cvs checkin.
  2. Opprettelse av ny revisjon og lagring i CVS. Gjøres med kommandoen «cvs ci». Man kan skrive inn en kommentar om hva som er gjort. Dette vil siden kunne listes ut så man kan få en komplett historie over utviklingen til fila. Det er på dette tidspunktet depotet blir oppdatert.
04:04:26 gunvald@carmbb:~/src/cvs/greier$ cvs add fil.txt
cvs add: scheduling file `fil.txt' for addition
cvs add: use 'cvs commit' to add this file permanently
04:04:44 gunvald@carmbb:~/src/cvs/greier$

Ved å utføre kommandoen

cvs ci

starter editoren som er spesifisert i miljøvariabelen CVSEDITOR med denne statusrapporten:

CVS: ----------------------------------------------------------------------
CVS: Enter Log.  Lines beginning with `CVS:' are removed automatically
CVS:
CVS: Committing in .
CVS:
CVS: Added Files:
CVS:    fil.txt
CVS: ----------------------------------------------------------------------

Det vises her hva som vil skje ved en cvs checkin — hvilke filer som er modifisert, lagt til eller fjernet. Teksten som her er lagt inn av CVS vil bli strippet bort, og på linjene over eller under denne meldingen kan du skrive inn en kommentar om hva som er gjort i denne versjonen, og deretter avslutte editoren. Hvis du lagret en ny versjon av denne filen, blir filen(e) lagt inn i CVS. Avsluttet du derimot editoren uten å lagre tekstfilen, kommer denne meldingen opp:

Log message unchanged or not specified
a)bort, c)ontinue, e)dit, !)reuse this message unchanged for remaining dirs
Action: (continue)

Du kan her velge å avbryte innleggingen, fortsette selv om loggmeldingen er uforandret, starte redigeringen av teksten en gang til, eller bruke den samme meldingen for alle underkataloger.

04:05:28 gunvald@carmbb:~/src/cvs/greier$ cvs ci
cvs commit: Examining .
RCS file: /home/gunvald/depot/greier/fil.txt,v
done
Checking in fil.txt;
/home/gunvald/depot/greier/fil.txt,v  <--  fil.txt
initial revision: 1.1
done
04:06:11 gunvald@carmbb:~/src/cvs/greier$

Fila er nå lagt inn i depotet og eventuelle andre brukere kan hente den ut ved hjelp av cvs update eller cvs checkout . Hvis du nå skriver fila ut, vil du se at den er blitt forandret:

07:27:05 gunvald@carmbb:~/src/cvs/greier$ cat fil.txt
$Id: fil.txt,v 1.1 2002/12/12 03:06:10 gunvald Exp $
Dette er en test.
07:27:11 gunvald@carmbb:~/src/cvs/greier$

Der det sto $Id$ er nå filnavnet, datoen og brukeren som lagret versjonen i CVS lagt inn.

Hvis du vil ha en oversikt over hva som er skjedd med fila, har vi metoder:

 04:53:57 gunvald@carmbb:~/src/cvs/greier$ cvs log fil.txt

 RCS file: /home/gunvald/depot/greier/fil.txt,v
 Working file: fil.txt
 head: 1.2
 branch:
 locks: strict
 access list:
 symbolic names:
 keyword substitution: kv
 total revisions: 2;     selected revisions: 2
 description:
 ----------------------------
 revision 1.2
 date: 2002/12/12 03:12:17;  author: gunvald;  state: Exp;  lines: +2 -1
 Andre versjon her.
 ----------------------------
 revision 1.1
 date: 2002/12/12 03:06:10;  author: gunvald;  state: Exp;
 Første versjon.
 =============================================================================
 04:53:59 gunvald@carmbb:~/src/cvs/greier$

Du kjenner nå til hovedprinsippene bak CVS, og vi kan gå løs på neste seksjon, som er alle kommandoene listet alfabetisk så man lettere kan lete seg fram til den man vil ha.

CVS-kommandoer[rediger]

cvs add[rediger]

Merker en fil for innleggelse i databasen. Neste gang en «cvs commit» gjøres, vil filen bli lagt til.

cvs admin[rediger]

Administrasjon av filer. Mange forskjellige endringer kan gjøres, som å forandre filtyper, forandre kommentarer og beskrivelser, slette revisjoner og mye annet. En mektig kommando.

cvs annotate[rediger]

List ut versjonen som ligger i databasen med en anmerkning foran hver linje om når siste forandring på den linja ble gjort. Kan brukes til lokalisering av tidspunkt når endringer ble gjort i det området i fila.

04:14:21 gunvald@carmbb:~/src/cvs/greier$ cvs ann fil.txt
Annotations for fil.txt
***************
1.2          (gunvald    12-Dec-02): $Id: fil.txt,v 1.1 2002/12/12 03:06:10 gunvald Exp $
1.1          (gunvald    12-Dec-02): Dette er en test.
1.2          (gunvald    12-Dec-02): Denne linja ble lagt til i revisjon 1.2 .
04:14:27 gunvald@carmbb:~/src/cvs/greier$

Synonym: «cvs ann»

cvs checkout[rediger]

Hent filer ut fra databasen. Standard oppførsel fra CVS er å hente ut siste versjon, men et tidspunkt eller spesiell versjon kan spesifiseres.

cvs checkout megaprog
Hent siste versjon av modulen megaprog og legg det i en katalog med samme navn.
cvs checkout -d annendir -D "1998-07-10 18:00" megaprog
Rekonstruer filene fra modulen megaprog sånn som de var på et spesielt tidspunkt og legg dem i en katalog som heter annendir .
cvs checkout -r testing
Hent versjonen som er merket som «testing». Dette kan være en versjon som er merket («cvs tag»), eller det kan være en utviklingsgren («cvs tag -b»).

Synonym: «cvs co»

cvs commit[rediger]

Legg inn en ny versjon av filene inn i databasen. Lokale endringer som er gjort vil bli loggført, og andre brukere vil få tilgang til endringene når kommandoen er fullført. Legg merke til at det er først ved utføring av denne kommandoen at databasen blir oppdatert hvis man har brukt kommandoene «cvs add» og «cvs remove».

Synonym: «cvs ci»

cvs diff[rediger]

Lag en «diff» av forskjellene mellom to utgaver av filene. En spesifikk versjon eller et tidspunkt kan spesifieres.

cvs diff -r ver_1_00
Vis hvilke forandringer som er gjort siden revisjon/tag ver_1_00
cvs diff -r ver_0_32 -r first_public
Vis forandringer mellom versjon ver_0_32 og first_public
cvs diff -r 1.13 index.cgi
Se hva som er gjort siden revisjon 1.13 av filen index.cgi.
cvs diff -D "2001-05-17 12:00"
Forandringer siden en viss dato.
cvs diff -D "2001-05-17 12:15<2001-05-19 17:12"
Forandringer mellom to tidspunkter.
cvs diff -D "1 month ago"
Viser forandringer som er gjort siste måneden. Flere tidsenheter kan brukes, eksempelvis «day» og «year». En kommando som kan brukes hvis sjefen spør: «Hva har du egentlig gjort den siste uka?» ☺
cvs diff -D "3 months ago<3 weeks ago" *.c *.h
Vis hva som skjedde med alle filer som slutter på «.c» og «.h» i perioden 3 måneder siden til 3 uker siden.
04:12:32 gunvald@carmbb:~/src/cvs/greier$ cvs diff -u -r 1.1
cvs diff: Diffing .
Index: fil.txt
===================================================================
RCS file: /home/gunvald/depot/greier/fil.txt,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -u -r1.1 -r1.2
--- fil.txt     12 Dec 2002 03:06:10 -0000      1.1
+++ fil.txt     12 Dec 2002 03:12:17 -0000      1.2
@@ -1,2 +1,3 @@
-$Id: fil.txt,v 1.1 2002/12/12 03:06:10 gunvald Exp $
+$Id: fil.txt,v 1.2 2002/12/12 03:12:17 gunvald Exp $
 Dette er en test.
+Denne linja ble lagt til i revisjon 1.2 .
04:12:42 gunvald@carmbb:~/src/cvs/greier$

cvs export[rediger]

Eksporter filer fra databasen. Nesten lik «cvs checkout», men «CVS»-katalogene blir ikke laget, og man må spesifisere hvilken versjon som skal hentes. Denne kommandoen brukes for eksempel når man skal lage en versjon klar for distribusjon.

cvs history[rediger]

Lag en oversikt over hva som har skjedd med filene. For eksempel hvem som har hentet eller lagt til filer.

Synonym: «cvs hi»

cvs import[rediger]

Importer filer inn i CVS. Kan brukes hvis store katalogstrukturer skal legges inn, eller en spesiell versjon skal importeres direkte fra kildekodekatalogen.

Synonym: «cvs imp»

cvs init[rediger]

Initialiser et nytt depot som ikke finnes fra før.

cvs log[rediger]

List historien til fila med tags og kommentarer som er lagt ved checkin.

cvs login[rediger]

Logg inn på en CVS-server via «pserver»-protokollen.

cvs logout[rediger]

Fjerner brukernavn og passord fra .cvspass i hjemmekatalogen din. Du er nå per definisjon logget ut, og må angi brukernavn og passord neste gang du skal kontakte depotet.

cvs remove[rediger]

Merker en eller flere filer for sletting. Filene blir ikke slettet fra CVS før kommandown «cvs commit» er utført. Det vil fortsatt være mulig å hente filene tilbake eller sammenligne to forskjellige versjoner av de slettede filene.

cvs status[rediger]

Vis status på filene som ligger lokalt, sammenlignet med versjonen som ligger i databasen.

 04:17:06 gunvald@carmbb:~/src/cvs/greier$ cvs stat fil.txt
 ===================================================================
 File: fil.txt           Status: Up-to-date

    Working revision:    1.2     Thu Dec 12 03:12:17 2002
    Repository revision: 1.2     /home/gunvald/depot/greier/fil.txt,v
    Sticky Tag:          (none)
    Sticky Date:         (none)
    Sticky Options:      (none)

 04:17:09 gunvald@carmbb:~/src/cvs/greier$

cvs tag[rediger]

Merk en fil med symbolsk navn[rediger]

Når en ny versjon slippes, kan alle filene som hører med merkes/tagges så de enten hører med til samme gruppe, eller enkelte filer kan merkes hvis det er noe spesielt med dem.

 02:09:21 gunvald@carmbb:~/src/cvs/greier$ cvs tag andre_versjon fil.txt
 T fil.txt
 02:09:31 gunvald@carmbb:~/src/cvs/greier$ cvs log fil.txt

 RCS file: /home/gunvald/depot/greier/fil.txt,v
 Working file: fil.txt
 head: 1.3
 branch:
 locks: strict
 access list:
 symbolic names:
         andre_versjon: 1.3
 keyword substitution: kv
 total revisions: 3;     selected revisions: 3
 description:
 ----------------------------
 revision 1.3
 date: 2002/12/12 04:07:23;  author: gunvald;  state: Exp;  lines: +3 -2
 Det blir nok store ting av denne fila, skal du se.
 ----------------------------
 revision 1.2
 date: 2002/12/12 03:12:17;  author: gunvald;  state: Exp;  lines: +2 -1
 Andre versjon her.
 ----------------------------
 revision 1.1
 date: 2002/12/12 03:06:10;  author: gunvald;  state: Exp;
 Første versjon.
 =============================================================================
 02:09:47 gunvald@carmbb:~/src/cvs/greier$

Revisjon 1.3 har nå fått navnet «andre_versjon».

Det var jo greit nok. Men etterhvert kommer vi fram til at det er mer logisk å sette dette merket på revisjon 1.2 . Det første vi da må gjøre, er å slette merket:

02:18:55 gunvald@carmbb:~/src/cvs/greier$ cvs tag -d andre_versjon fil.txt
D fil.txt
02:19:09 gunvald@carmbb:~/src/cvs/greier$

Sett merket på den nye plassen:

02:21:27 gunvald@carmbb:~/src/cvs/greier$ cvs tag -r 1.2 andre_versjon fil.txt
T fil.txt
02:21:44 gunvald@carmbb:~/src/cvs/greier$

Dette kan også gjøres i en operasjon ved å legge til "-F", det flytter merket til den nye revisjonen hvis det eksisterer på denne filen fra før.

Hent ut siste versjon av filene og merk dem som «release_candiate_1»:

02:26:31 gunvald@carmbb:~/src/cvs/greier$ cvs -q upd -dA
02:26:41 gunvald@carmbb:~/src/cvs/greier$ cvs tag release_candidate_1
cvs tag: Tagging .
T fil.txt
T snadder.txt
02:27:12 gunvald@carmbb:~/src/cvs/greier$

«Branching»[rediger]

Hvis «-b»-parameteret spesifiseres etter tag-kommandoen, vil den nåværende grenen bli splittet i to, og man kan drive separat utvikling i en egen, separat rekkefølge som ikke vil blande seg med andre versjoner. Det kan være fordi det er en eksperimentell versjon, eller man vil for eksempel rette en feil i akkurat den versjonen uten å blande inn nyere versjoner.

Vi kan for eksempel splitte utviklingen av fila vår — fil.txt — i en egen gren som springer ut fra revisjon 1.2 .

Først setter vi fila til revisjon 1.2:

01:38:14 gunvald@carmbb:~/src/cvs/greier$ cvs upd -r 1.2 fil.txt
U fil.txt
01:38:24 gunvald@carmbb:~/src/cvs/greier$

Deretter kjører vi tag-kommandoen som sammen med «-b» lager en splitt:

01:38:24 gunvald@carmbb:~/src/cvs/greier$ cvs tag -b spesialversjon fil.txt
T fil.txt
01:41:49 gunvald@carmbb:~/src/cvs/greier$

Vi (du) har nå opprettet en egen gren som springer ut av hovedgrenen i fil.txt , og den heter «spesialversjon». Men vi befinner oss fortsatt på hovedgrenen, så for at nye endringer skal bli lagret til den nye grenen, er det enkleste å «bevege seg til den». Dette gjøres ved å oppdatere seg til denne grenen med cvs update:

01:55:55 gunvald@carmbb:~/src/cvs/greier$ cvs upd -r spesialversjon
cvs update: Updating .
cvs update: snadder.txt is no longer in the repository
01:56:14 gunvald@carmbb:~/src/cvs/greier$

Her ser vi at filen snadder.txt forsvinner, den var ikke med på den nye grenen som ble laget. fil.txt ligger der fortsatt, men vi jobber nå på den versjonen som ligger på «spesialversjon»-grenen. Dette ser vi med «cvs stat»:

 01:59:51 gunvald@carmbb:~/src/cvs/greier$ cvs stat fil.txt
 ===================================================================
 File: fil.txt           Status: Up-to-date

    Working revision:    1.2     Fri Apr 11 23:38:23 2003
    Repository revision: 1.2     /home/gunvald/depot/greier/fil.txt,v
    Sticky Tag:          spesialversjon (branch: 1.2.2)
    Sticky Date:         (none)
    Sticky Options:      (none)

 01:59:56 gunvald@carmbb:~/src/cvs/greier$

«Sticky tag» beskriver på hvilken gren denne fila er aktiv, eller om den er låst til en spesiell revisjon. Vi gjør nå noen små forandringer, for eksempel legger til en linje og deretter sjekker den inn i CVS:

02:03:55 gunvald@carmbb:~/src/cvs/greier$ vim fil.txt
02:04:49 gunvald@carmbb:~/src/cvs/greier$ cvs ci
cvs commit: Examining .
Checking in fil.txt;
/home/gunvald/depot/greier/fil.txt,v  <--  fil.txt
new revision: 1.2.2.1; previous revision: 1.2
done
02:06:55 gunvald@carmbb:~/src/cvs/greier$

Når du står i editoren vil en «Tag:»-linje komme til syne og vise at du er i ferd med å legge fila til på en sidegren og ikke på hovedgrenen:

CVS: ----------------------------------------------------------------------
CVS: Enter Log.  Lines beginning with `CVS:' are removed automatically
CVS:
CVS: Committing in .
CVS:
CVS: Modified Files:
CVS:  Tag: spesialversjon
CVS:    fil.txt
CVS: ----------------------------------------------------------------------

Den nye versjonen som ble lagt inn har nå fått et utvidet revisjonsnummer, to ekstra sifre er lagt til under «1.2»-grenen. «No har me juksa litt» og gjort et par småting på fila som ikke er beskrevet her, og en «cvs log» gir nå dette resultatet:

 22:57:16 gunvald@carmbb:~/src/cvs/greier$ cvs log fil.txt

 RCS file: /home/gunvald/depot/greier/fil.txt,v
 Working file: fil.txt
 head: 1.4
 branch:
 locks: strict
 access list:
 symbolic names:
         spesialversjon: 1.2.0.2
         release_candidate_1: 1.3
         andre_versjon: 1.2
 keyword substitution: kv
 total revisions: 6;     selected revisions: 6
 description:
 ----------------------------
 revision 1.4
 date: 2003/04/15 20:57:15;  author: gunvald;  state: Exp;  lines: +2 -1
 En linje lagt til på hovedgrenen.
 ----------------------------
 revision 1.3
 date: 2002/12/12 04:07:23;  author: gunvald;  state: Exp;  lines: +3 -2
 Det blir nok store ting av denne fila, skal du se.
 ----------------------------
 revision 1.2
 date: 2002/12/12 03:12:17;  author: gunvald;  state: Exp;  lines: +2 -1
 branches:  1.2.2;
 Andre versjon her.
 ----------------------------
 revision 1.1
 date: 2002/12/12 03:06:10;  author: gunvald;  state: Exp;
 Første versjon.
 ----------------------------
 revision 1.2.2.2
 date: 2003/04/15 20:55:22;  author: gunvald;  state: Exp;  lines: +2 -1
 Enda en linje lagt til i spesialversjonen.
 ----------------------------
 revision 1.2.2.1
 date: 2003/04/12 00:06:54;  author: gunvald;  state: Exp;  lines: +2 -1
 Lagt til på utviklingsgrenen «spesialversjon».
 =============================================================================
 22:57:19 gunvald@carmbb:~/src/cvs/greier$

Utviklingen kan visualiseres på denne måten:

─┬─ 1.1 Første versjon
 │
 ├─ 1.2 Andre versjon
 │  │
 │  ├─ 1.2.2.1 Lagt til på utviklingsgrenen «spesialversjon»
 │  │
 │  └─ 1.2.2.2 Enda en linje lagt til i spesialversjonen.
 │
 ├─ 1.3 Det blir nok store ting av denne fila, skal du se
 │
 └─ 1.4 En linje lagt til på hovedgrenen.

Hovedgrenen har kontinuerlige revisjoner til og med 1.4, og på revisjon 1.2 er det lagt inn en splitt der parallell utvikling kan gjøres. Revisjonsnumrene vil her være 1.2.2.x , og du vil ved å se på dem være i stand til å se hvilke versjoner revisjonene stammer fra.

cvs update[rediger]

Oppdater de lokale filene. Hvis ingen valg spesifiseres til denne kommandoen, oppdateres versjonen til den siste som er på denne utviklingsgrenen.

cvs update -D "4 days ago"
Oppdater filene til sånn som de var for 4 døgn siden.
cvs update -r spesialversjon
Skift utviklingsgren til «spesialversjon». De fleste videre kommandoer vil kun skje på denne grenen, uavhengig av andre versjoner.

Statusmeldinger ved cvs update[rediger]

U filnavn
Fila ble oppdatert. Den var eldre enn den som lå i databasen, eller den har blitt lagt til.
P filnavn
Som «U», men CVS-serveren sendte en patch istedenfor hele fila. Resultatet er det samme.
A filnavn
Fila er lagt til med «cvs add», men «cvs checkin» er ikke blitt kjørt enda. Den er dermed ikke tilgjengelig fra databasen enda.
R filnavn
Fila er merket for sletting og vil bli slettet fra denne utviklingsgrenen ved neste «cvs checkin».
M filnavn
Du har modifisert fila uten å kjøre «cvs checkin».
C filnavn
En konflikt har oppstått med denne fila.
? filnavn
Denne fila er ikke lagt inn i CVS og er dermed ukjent.

Synonym: «cvs upd»

cvs version[rediger]

Skriv ut versjonsnummeret av CVS som kjøres lokalt og eventuelt serveren som filene i katalogen ligger på.