Versionshantering för den yrvakne
Eller: Hur jag slutade oroa mig och började älska versioner
Erik Forsberg, Lysator ACS
forsberg@lysator.liu.se
http://www.lysator.liu.se/~forsberg/
http://www.lysator.liu.se/~forsberg/rawlab2002-03/versionshantering.html
Agenda
- Vad är versionshantering?
- Varför vill man använda det?
- Begrepp
- Vilka system finns?
- SCCS, Clearcase
- RCS
- Något om patch och diff
- Keyword substitution
- CVS
Ställ frågor!
Vad är versionshantering?
- Spara historia för dina filer.
- ..dvs alla versioner du haft av filen.
- Se skillnader mellan olika versioner av filen.
- Spara på ett utrymmeseffektivt sätt.
- Spara metainformation om dina filer.
- Datum när ändringar gjordes
- Vem som gjorde ändringarna
- Kommentarer om vad som ändrades, och varför.
Varför versionshantering?
- Världen är full av idioter.
"95% av världens befolkning är idioter"
- Erik Forsberg - Se vem som gjort en viss ändring.
- Håll reda på vilka filer som ingår i en viss version av en produkt.
- Se vilka ändringar som gjorts mellan vissa datum.
- Få loggmeddelanden på alla ändringar.
- Lås filer som bara bör editeras av en person i taget
(/etc/aliases, ...) - Möjlighet att vara flera personer som editerar en fil tillsammans.
- Få hjälp att lösa konflikter när flera editerat en fil samtidigt.
- Få koll på vad som händer i ett projekt.
Varför versionshantering?
Vid mjukvarautveckling bör man inte ställa sig frågan om man ska använda ett versionshanteringssystem utan snarare vilket. Utveckling/ändringar som görs utan versionshantering brukar väldigt ofta försvinna ut i /dev/null och aldrig komma till användning, IMHO. - Peter Åstrand.Versionshanteringssystem
- SCCS
- Clearcase
- RCS - Revision Control System
- CVS - Concurrent Versions System
- Bitkeeper OBS: HAR ÄCKLIG LICENS!
- Subversion
- Arch
- ...
Vilket versionshanteringssystem vid vilket tillfälle?
- Enskilda filer och egna små projekt: RCS
- Utveckling tillsammans med andra, öppen utveckling: CVS
- Linuxkärnan: Tydligen Bitkeeper.
- I framtiden: Subversion i stället för CVS?
Begrepp
- Revision
En kopia av en enskild fil som den såg ut vid en viss tidpunkt. - Version
Inte alls samma sak som Revision. Versioner är något man hittar på programvaror.. En programvara är byggd av ett antal filer av olika Revisioner. - Repository
Den plats där de filer som representerar alla versioner av dina filer ligger. "Själva databasen". - Delta
Skillnaden mellan två revisioner. Lagras i repositoryt.Begrepp - fortsättning
- Working copy (arbetskopia)
Din lokala kopia av en eller flera versionshanterade filer. - Commit, Checka in
Uppdatera repositoriet med de ändringar du gjort. - Checka ut
Hämta ut filer från ett repository.
RCS - Revision Control System
- Enkelt att komma igång med.
- Utmärkt för mindre privata projekt, samt ex.vis systemfiler.
- Ingår i de flesta unixar redan från början.
- Kompatibelt med CVS, samma filformat.
RCS - hur funkar det?
- Inget explicit repository, utan varje fil får en extrafil med deltan i.
- Filen som håller reda på filen <filnamn> heter <filnamn>,v
- <filnamn>,v ligger normalt i samma katalog som <filnamn>
- Om en underkatalog finns som heter RCS läggs <filnamn>,v där i stället.
- Filerna som heter <filnamn>,v är textbaserade.
RCS - hur använder jag det
- Du behöver några unixkommandon..
- ci
Checka in till versionhanteringsfilen från working copy. - co
Checka ut från versionshanteringsfilen till en working copy. - rlog
Kika på loggen för en eller flera filer. - rcsdiff
Kolla skillnad mellan två revisioner. - rcs
För mindre vanliga uppgifter.
- ci
- Din favoriteditor (emacs) kan göra de vanligaste sakerna åt dig.
Mer om detta senare.
RCS - ett exempel
Om man har en fil..
-- begin hello.c --
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 0;
}
-- end hello.c --
..så kör vi lite kommandon:
hostname:erik ~ % mkdir RCS hostname:erik ~ % ci hello.c RCS/hello.c,v <-- hello.c enter description, terminated with single '.' or end of file: NOTE: This is NOT the log message! >> A Hello World program. >> . initial revision: 1.1 done
Vad hände?
Nu är filen incheckad. Notera att:- Filen hello.c "försvann"
- Det finns en fil i katalogen RCS som heter hello.c,v - kika i den, den är textbaserad.
RCS - ett exempel, forts.
Nu checkar vi ut filen igen..hostname:erik ~ % co hello.c RCS/hello.c,v --> hello.c revision 1.1 done hostname:erik ~ % ls -l hello.c -r--r--r-- 1 erik erik 87 Mar 18 21:36 hello.cFilen checkas ut i read-only-läge. Vilket är helt rätt om vi bara ska kompilera den.
Om vi vill editera filen låser vi den.
hostname:erik ~ % co -l hello.c RCS/hello.c,v --> hello.c revision 1.1 (locked) done hostname:erik ~ % ls -l hello.c -rw-r--r-- 1 erik erik 87 Mar 18 21:38 hello.c
USCH! En massa äckliga unixkommandon!!!
- C-x v i registrerar en fil för versionshantering. Funkar inte med CVS.
- C-x C-q låser/låser upp en fil i RCS. Checkar in i CVS.
- C-x v l visar loggen för en fil.
RCS - ett exempel, forts.
Vi gör om hello.c lite..
-- begin hello.c --
#include <stdio.h>
/* Hello, World - De luxe version */
int main(int argc, char **argv) {
if (2 == argc) {
printf("Hello, %s\n", argv[1]);
} else {
printf("Hello, world!\n");
}
return 0;
}
-- end hello.c --
..om vi lyckades introducera en bugg i det här programmet är det
viktigt att vi vet var någonstans buggen introducerades, så vi checkar
in den här revisionen:
hostname:erik ~ % ci -u hello.c RCS/hello.c,v <-- hello.c new revision: 1.2; previous revision: 1.1 enter log message, terminated with single '.' or end of file: >> Added possibility of personal greeting. >> . done-u gör att vi behåller filen utcheckad, men inte låst. Dvs read-only.
RCS - ett exempel, forts.
Två månader senare är vi jätteintresserade av vad vi gjorde med filen för två månader sedan. Vi kollar på loggen:hostname:erik ~ % rlog hello.c RCS file: RCS/hello.c,v Working file: hello.c head: 1.2 branch: locks: strict access list: symbolic names: keyword substitution: kv total revisions: 2; selected revisions: 2 description: A Hello World program. ---------------------------- revision 1.2 date: 2002/03/18 20:47:40; author: erik; state: Exp; lines: +8 -3 Added possibility of personal greeting. ---------------------------- revision 1.1 date: 2002/03/18 20:31:44; author: erik; state: Exp; Initial revision =============================================================================
Några ord om 'diff' och 'patch'
- 'diff' jämför två filer och visar skillnader mellan dem.
- 'patch' tar en existerande fil och output från 'diff' och sätter ihop en ny fil.
- Används för att distribuera skillnader i källkod. Linuxkärnor och annat skräp, exempelvis.
- Olika diff-format finns. Unified context diff är det vanligaste. Går att läsa..
- + betyder "raden tillagd jämfört med gamla versionen"
- - betyder "raden borttagen jämfört med gamla versionen"
- ! betyder "raden ändrad jämfört med gamla versionen"
- Context på n rader. n = 3, oftast.
- Radnummer
- Fuzzy match.
diff -u
- -u gör att vi får unified diff, det mest använda och mest lättlästa diff-formatet.
- "Folk som presenterar ickeunifierade diffar brukar bli satta i skamstock"
- Peter Bortas
RCS - ett exempel, forts.
Men vad var det vi gjorde egentligen, mellan revision 1.1 och revision 1.2? Vi kollar med rcsdiff:
hostname:erik ~ % rcsdiff -u -r1.1 -r1.2 hello.c
===================================================================
RCS file: RCS/hello.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- hello.c 2002/03/18 20:31:44 1.1
+++ hello.c 2002/03/18 20:47:40 1.2
@@ -1,5 +1,10 @@
#include <stdio.h>
-int main(void) {
- printf("Hello, world!\n");
- return 0;
+/* Hello, World - De luxe version */
+int main(int argc, char **argv) {
+ if (2 == argc) {
+ printf("Hello, %s\n", argv[1]);
+ } else {
+ printf("Hello, world!\n");
+ }
+ return 0;
}
Keyword substitution
Både RCS och CVS har möjlighet att ersätta speciella strängar i filer med mer eller mindre relevant information.- $Author: forsberg $ ersätts med username på den användare som checkade in aktuell revision.
- $Revision: 1.1.1.1 $ ersätts med revision för filen.
- $Id: versionshantering.html,v 1.1.1.1 2004/09/19 12:09:20 forsberg Exp $ ersätts med filnamn, revision, timestamp, författare och state (låsstatus)
- $Log: versionshantering.html,v $ Revision 1.1.1.1 2004/09/19 12:09:20 forsberg Initial import Revision 1.3 2002/11/22 13:21:10 forsberg Incorrect balance. ersätts med loggen för filen. Ställer till problem när man skickar patchar. Rekommenderas inte!
Kan användas i programkod och visas i exempelvis en about-ruta.
CVS - Concurrent Versions System
- I princip samma funktionalitet som RCS men:
- Concurrent - flera personer kan editera samma fil samtidigt
- Bättre nätverksfunktionalitet
- Möjlighet till anonyma utdelningar.
- Samma filformat som RCS.
- Filer under RCS kan enkelt flyttas till CVS.
CVS - allmänt
- Alla operationer görs med kommandot cvs med olika argument.
- De flesta operationerna kan utföras på en fil, på ett gäng filer eller rekursivt.
- Ett antal flaggor delas mellan alla operationer. Se manualen.
CVS - Repository
- Till skillnad från RCS har CVS ett explicit repository.
- Flera accessmetoder
- Accessmetod bestäms av miljövariablen CVSROOT eller parametern -d
- ..eller innehållet i filen Root som bor i katalogen CVS i varje subkatalog.
CVS - Repositoryaccessmetoder
- Lokalt, mot katalog. Även över NFS.
CVSROOT=<path>
Exempel: CVSROOT=/var/cvsroot - Med pserver, ett nätverksprotokoll
CVSROOT=:pserver:<user>@<hostname>:<path>
Exempel: CVSROOT=:pserver:anonymous@cvs.lysator.liu.se:/cvsroot/lyscvs
Protokollet använder klartextlösen, eller Kerberos. - Över rsh eller (mer vanligt, och bättre) ssh
CVSROOT=<user>@<hostname>:<path>
Exempel: CVSROOT=forsberg@cvs.lysator.liu.se:/cvsroot/lyscvs
Viktigt: CVS_RSH=ssh - CVS_RSH är fel i 78% av fallen :-).
Kuriosa: pserverprotokollet
Pserver-protokollet har ett något annorlunda sätt att ge statuskoder vid inloggning..
I HATE YOU
CVS - Concurrent
- Flera kan editera samma fil samtidigt.
- Ingen låsning.
- Ja, det fungerar!
- Viss religion i låsningsfrågan.
CVS - Working copy, commit
- Alla har en utcheckad working copy
- Inte en katalog som alla jobbar mot, som RCS
- Varje person gör ändringar i sin katalog
- Commit görs när ändringarna är färdiga
CVS - konflikter
- CVS "mergar" normalt ändringar som gjorts till samma fil av två personer.
- Funkar oftast. Funkar inte när samma rad editerats.
- När det inte funkar måste manuell merge göras.
- Konfliktstället markeras.
- Manuell rättning, sedan ny commit
CVS - moduler
- Oftast subprojekt
- ..i egen katalog.
- Kan vara virtuella
- Mer om detta senare
CVS - dags för ett exempel
Förutsättningar
- Samma hello.c som tidigare..
- Ett repository lokalt på /var/cvsroot
- Med modulen foo
-- begin hello.c --
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 0;
}
-- end hello.c --
CVS - ett första exempel, fortsättning
Checka ut modulen foo
hostname:erik ~/ex % cvs co foo cvs checkout: Updating foo hostname:erik ~/ex % ls -l total 1 drwxr-sr-x 3 erik erik 1024 Mar 21 20:14 foo hostname:erik ~/ex % ls -l foo total 1 drwxr-sr-x 2 erik erik 1024 Mar 21 20:14 CVS hostname:erik ~/ex % ls -l foo/CVS total 3 -rw-r--r-- 1 erik erik 2 Mar 21 20:14 Entries -rw-r--r-- 1 erik erik 4 Mar 21 20:14 Repository -rw-r--r-- 1 erik erik 13 Mar 21 20:14 Root
CVS - ett första exempel, fortsättning
Lägg till filen hello.c
hostname:erik ~/ex/foo % cvs add -m"A very simple Hello World example" hello.c cvs add: scheduling file `hello.c' for addition cvs add: use 'cvs commit' to add this file permanently
Obs! Ändringen syns ej för andra användare än. Vi måste..
Skicka in ändringen - commit
hostname:erik ~/ex/foo % cvs commit -m"First checkin of hello.c" hello.c RCS file: /var/cvsroot/foo/hello.c,v done Checking in hello.c; /var/cvsroot/foo/hello.c,v <-- hello.c initial revision: 1.1 doneOm flaggan -m inte anges med ett meddelande startas en editor. Miljövariabeln EDITOR eller VISUAL avgör vilken.
Dagens tips: 'ed' brukar gå att avsluta med ett 'q' :-).
CVS ett första exempel, fortsättning
Vi kollar på status för filen
hostname:erik ~/ex/foo % cvs status hello.c =================================================================== File: hello.c Status: Up-to-date Working revision: 1.1 Thu Mar 21 19:18:07 2002 Repository revision: 1.1 /var/cvsroot/foo/hello.c,v Sticky Tag: (none) Sticky Date: (none) Sticky Options: (none)
CVS - ett första exempel, fortsättning
Vi kollar på loggen för filen
hostname:erik ~/ex/foo % cvs log hello.c RCS file: /var/cvsroot/foo/hello.c,v Working file: hello.c head: 1.1 branch: locks: strict access list: symbolic names: keyword substitution: kv total revisions: 1; selected revisions: 1 description: A very simple Hello World example ---------------------------- revision 1.1 date: 2002/03/21 19:20:00; author: erik; state: Exp; First checkin of hello.c =============================================================================
CVS - ett första exempel, fortsättning
Vi kollar på ping-statistiken för SUBNet
hostname:erik ~ % ping default-gw PING default-gw (130.236.227.1): 56 data bytes 64 bytes from 130.236.227.1: icmp_seq=12 ttl=64 time=5.2 ms 64 bytes from 130.236.227.1: icmp_seq=116 ttl=64 time=2301.1 ms 64 bytes from 130.236.227.1: icmp_seq=117 ttl=64 time=1302.3 ms 64 bytes from 130.236.227.1: icmp_seq=118 ttl=64 time=303.3 ms 64 bytes from 130.236.227.1: icmp_seq=119 ttl=64 time=11.5 ms 64 bytes from 130.236.227.1: icmp_seq=151 ttl=64 time=1010.9 ms 64 bytes from 130.236.227.1: icmp_seq=152 ttl=64 time=12.3 ms 64 bytes from 130.236.227.1: icmp_seq=189 ttl=64 time=19.5 ms 64 bytes from 130.236.227.1: icmp_seq=222 ttl=64 time=4.4 ms 64 bytes from 130.236.227.1: icmp_seq=254 ttl=64 time=2011.1 ms 64 bytes from 130.236.227.1: icmp_seq=292 ttl=64 time=34.1 ms 64 bytes from 130.236.227.1: icmp_seq=362 ttl=64 time=29.6 ms 64 bytes from 130.236.227.1: icmp_seq=363 ttl=64 time=269.2 ms 64 bytes from 130.236.227.1: icmp_seq=396 ttl=64 time=4.3 ms 64 bytes from 130.236.227.1: icmp_seq=536 ttl=64 time=4.7 ms 64 bytes from 130.236.227.1: icmp_seq=573 ttl=64 time=9.6 ms 64 bytes from 130.236.227.1: icmp_seq=605 ttl=64 time=1007.0 ms 64 bytes from 130.236.227.1: icmp_seq=606 ttl=64 time=8.2 ms --- default-gw ping statistics --- 620 packets transmitted, 18 packets received, 97% packet loss round-trip min/avg/max = 4.3/463.7/2301.1 msInget LysKOM här inte.. Man kan ha tråkigt i April.
CVS - ett första exempel, fortsättning
Vi ändrar lite i hello.c
-- begin hello.c --
#include <stdio.h>
/* Hello, World - De luxe version */
int main(int argc, char **argv) {
if (2 == argc) {
printf("Hello, %s\n", argv[1]);
} else {
printf("Hello, world!\n");
}
return 0;
}
-- end hello.c --
CVS - ett första exempel, fortsättning
Vi kollar skillnaden mellan repository och nuvarande fil
hostname:erik ~/ex/foo % cvs diff -u
cvs diff: Diffing .
Index: hello.c
===================================================================
RCS file: /var/cvsroot/foo/hello.c,v
retrieving revision 1.1
diff -u -b -B -u -r1.1 hello.c
--- hello.c 2002/03/21 19:20:00 1.1
+++ hello.c 2002/03/21 19:35:40
@@ -1,5 +1,10 @@
#include <stdio.h>
-int main(void) {
+/* Hello, World - De luxe version */
+int main(int argc, char **argv) {
+ if (2 == argc) {
+ printf("Hello, %s\n", argv[1]);
+ } else {
printf("Hello, world!\n");
+ }
return 0;
}
Notera att -u kan läggas in i .cvsrc
CVS - ett första exempel, fortsättning
Vi skickar in våra ändringar till repositoriet
hostname:erik ~/ex/foo % cvs commit -m"Fixed deluxe options (optional user-specified message)" hello.c Checking in hello.c; /var/cvsroot/foo/hello.c,v <-- hello.c new revision: 1.2; previous revision: 1.1 done
CVS ett första exempel, fortsättning
Vi kollar på loggen för filen
hostname:erik ~/ex/foo % cvs log hello.c RCS file: /var/cvsroot/foo/hello.c,v Working file: hello.c head: 1.2 branch: locks: strict access list: symbolic names: keyword substitution: kv total revisions: 2; selected revisions: 2 description: A very simple Hello World example ---------------------------- revision 1.2 date: 2002/03/21 19:38:04; author: erik; state: Exp; lines: +8 -3 Fixed deluxe options (optional user-specified message) ---------------------------- revision 1.1 date: 2002/03/21 19:20:00; author: erik; state: Exp; First checkin of hello.c =============================================================================
CVS - uppdatering av workingcopy
Om andra har gjort commit måste du uppdatera ditt repository.Vi kollar status på filen
hostname:erik ~/ex/foo % cvs status cvs status: Examining . =================================================================== File: hello.c Status: Needs Patch Working revision: 1.2 Thu Mar 21 19:35:40 2002 Repository revision: 1.3 /var/cvsroot/foo/hello.c,v Sticky Tag: (none) Sticky Date: (none) Sticky Options: (none)
Aha! Någon har gjort en ändring! Vi uppdaterar:
hostname:erik ~/documentation/rawlab200203/ex/foo % cvs update cvs update: Updating . U hello.cFilen är nu uppdaterad till senaste version.
CVS - uppdatering av workingcopy
Vi kan kolla på loggen
hostname:erik ~/documentation/rawlab200203/ex/foo % cvs log hello.c RCS file: /var/cvsroot/foo/hello.c,v Working file: hello.c head: 1.3 branch: locks: strict access list: symbolic names: keyword substitution: kv total revisions: 3; selected revisions: 3 description: A very simple Hello World example ---------------------------- revision 1.3 date: 2002/03/21 21:04:42; author: tset; state: Exp; lines: +1 -2 Applied Jönköping-specific local changes. ---------------------------- revision 1.2 date: 2002/03/21 19:38:04; author: erik; state: Exp; lines: +8 -3 Fixed deluxe options (optional user-specified message) ---------------------------- revision 1.1 date: 2002/03/21 19:20:00; author: erik; state: Exp; First checkin of hello.c =============================================================================
CVS - uppdatering av workingcopy
Vi kan se vem som gjort vad i filen
hostname:erik ~/documentation/rawlab200203/ex/foo % cvs annotate hello.c
Annotations for hello.c
***************
1.1 (erik 21-Mar-02): #include <stdio.h>
1.2 (erik 21-Mar-02): /* Hello, World - De luxe version */
1.2 (erik 21-Mar-02): int main(int argc, char **argv) {
1.2 (erik 21-Mar-02): if (2 == argc) {
1.2 (erik 21-Mar-02): printf("Hello, %s\n", argv[1]);
1.2 (erik 21-Mar-02): } else {
1.3 (tset 21-Mar-02): printf("Hello, Könjöping!\n"); }
1.2 (erik 21-Mar-02): return 0;
1.1 (erik 21-Mar-02): }
CVS - ta bort filer
- Gör commit på filen, om det behövs.
rm <filnamn>
cvs rm <filnamn>
cvs commit <filnamn>
Återskapa en borttagen fil
- Gör
cvs log <filnamn>
för att se vilken revision du vill ha ut. - Gör
cvs update -r<version>
om du bara vill kika på filen - sticky. - Gör
cvs update -r<version> -p > <filnamn>
följt av commit gör en ny revision av filen.
CVS - ta bort kataloger
- Ta bort alla filer, enligt ovan.
- Ange -P vid
cvs update cvs checkout cvs export
så tas inte katalogen med. - Kan anges i en fil vid namn ~/.cvsrc . Exempel:
diff -u -b -B checkout -P update -d -P
CVS - Något om repositoriet
- Måste initialiseras en gång.
hostname:erik ~ % export CVSROOT=/var/tmp/foobar hostname:erik ~ % cvs init
- Läs/skrivrättigheter på katalogen är viktigt.
- Innehåller en katalog, CVSROOT
- ..med diverse filer i.
CVS - Något om repositoriet
hostname:erik /var/tmp/foobar % ls -l CVSROOT total 31 -r--r--r-- 1 erik root 493 Mar 21 21:12 checkoutlist -r--r--r-- 1 erik root 693 Mar 21 21:12 checkoutlist,v -r--r--r-- 1 erik root 760 Mar 21 21:12 commitinfo -r--r--r-- 1 erik root 960 Mar 21 21:12 commitinfo,v -r--r--r-- 1 erik root 364 Mar 21 21:12 config -r--r--r-- 1 erik root 564 Mar 21 21:12 config,v -r--r--r-- 1 erik root 753 Mar 21 21:12 cvswrappers -r--r--r-- 1 erik root 953 Mar 21 21:12 cvswrappers,v -r--r--r-- 1 erik root 1025 Mar 21 21:12 editinfo -r--r--r-- 1 erik root 1225 Mar 21 21:12 editinfo,v -rw-rw-r-- 1 erik root 0 Mar 21 21:12 history -r--r--r-- 1 erik root 1141 Mar 21 21:12 loginfo -r--r--r-- 1 erik root 1341 Mar 21 21:12 loginfo,v -r--r--r-- 1 erik root 1151 Mar 21 21:12 modules -r--r--r-- 1 erik root 1351 Mar 21 21:12 modules,v -r--r--r-- 1 erik root 564 Mar 21 21:12 notify -r--r--r-- 1 erik root 764 Mar 21 21:12 notify,v -r--r--r-- 1 erik root 649 Mar 21 21:12 rcsinfo -r--r--r-- 1 erik root 849 Mar 21 21:12 rcsinfo,v -r--r--r-- 1 erik root 879 Mar 21 21:12 taginfo -r--r--r-- 1 erik root 1079 Mar 21 21:12 taginfo,v -r--r--r-- 1 erik root 1026 Mar 21 21:12 verifymsg -r--r--r-- 1 erik root 1226 Mar 21 21:12 verifymsg,vAdministrativa filer.
CVS - CVSROOT-katalogen
- loginfo styr vad som ska hända med loggen. Mailutskick är möjligt.
- commitinfo kan användas för att göra kodkoll vid commit.
- modules styr vilka (virtuella) moduler som finns.
- config styr några parametrar. Var låsfiler läggs, exempelvis.
- taginfo styr program som exekveras när någon sätter en tag.
CVS - Något om repositoriet
- Varje modul har en egen katalog.
- I katalogerna ligger underkataloger, samt RCS-filer.
- Allt är textbaserat och hyffsat enkelt att förstå.
- Inga binärformat som går sönder...
- ..om man inte skriver fullt på disken
CVS - Att komma igång
- Enklast är oftast att använda import
- Skapa en katalogstruktur, eller använd en existerande.
- Kör 'cvs import' med argument.
- Gå till en annan katalog.
- Checka ut den nyligen importerade modulen.
- Börja jobba.
- Om filsystemstillgång finns till repository kan moduler skapas i den med mkdir.
- Om systemet redan finns i RCS kopieras <filnamn>,v-filerna till repositoriet på enklaste sätt.
CVS - 'cvs import'
cvs import <repository> <vendor> <releasetag>- repository är katalogen under $CVSROOT där importen hamnar.
En modul, mer eller mindre. - vendortag är något som beskriver vem som gjort koden.
- releasetag beskriver versionen av koden.
hostname:erik ~/ex/tbidir % ls -l total 3 drwxr-sr-x 2 erik erik 1024 Mar 21 21:48 foobar drwxr-sr-x 2 erik erik 1024 Mar 21 21:48 gazonk drwxr-sr-x 2 erik erik 1024 Mar 21 21:48 gurkburk hostname:erik ~/ex/tbidir % cvs import -m"Created directory structure" tbimod vendor initial_import cvs import: Importing /var/cvsroot/tbimod/foobar cvs import: Importing /var/cvsroot/tbimod/gazonk cvs import: Importing /var/cvsroot/tbimod/gurkburk No conflicts created by this import hostname:erik ~/ex/tbidir % cd .. hostname:erik ~/ex % cvs co tbimod cvs checkout: Updating tbimod cvs checkout: Updating tbimod/foobar cvs checkout: Updating tbimod/gazonk cvs checkout: Updating tbimod/gurkburk
CVS - 'cvs import'
- import kan användas för att hålla reda på extern mjukvara.
- Importera en första gång. Sätt vendor till ex. vis. "GNU"
- Sätt versiontag till ex. vis. "rel1_0" för v1.0 av mjukvaran.
- Gör dina egna ändringar och checka in dem.
- Importera en gång till. Dina ändringar mergas nu "automatiskt" in.
- Diffa mellan originalkod och dina egna ändringar.
- Lite småtrickigt, ibland..
CVS - Taggar
- Tag en markering på ett antal filer.
- Håller ordning på exempelvis vilka revisioner som hör till en viss release.
- Användbart för att hitta buggar i en viss release, m. m.
- Sätts med cvs tag
- Kan användas i stället för revisioner med -r
- Lista skillnader mellan taggen REL_1_4 och nu:
cvs diff -u -rREL_1_4
CVS - Branch
- Branches är ett sätt att hålla ordning på olika utvecklingsgrenar.
- Praktiskt att ha olika grenar för development och stable.
- Håll ordning på buggfixar för olika versioner.
- Möjligt att buggfixa trots att utvecklingsversionen inte ens kompilerar.
- Merge av fixar till huvudgrenen.
- Nästan material för en egen föreläsning.

CVS - i Emacs
Inbyggt - vc-minormode
- C-x v i registrerar en fil för versionshantering.
- C-x C-q låser/låser upp en fil i RCS. Checkar in i CVS.
- Emacs poppar själv upp en buffert för att editera logmeddelande i.
- C-x v l visar loggen för en fil.
- C-x v = visar diff mellan filen och fil i repository.
- C-u C-x v = visar diff mellan två olika versioner av filen.
M-x cvs-update
- Kan fler saker.
- Lägga till filer i CVS.
- Ignorera filer
- Visa status och diff för en katalog, rekursivt.
- Checka in flera filer samtidigt.
CVS över SSH
- Går ibland långsammare än man vill.
- En uppkoppling per cvs-kommando.
- lsh -G med lshg hjälper. Persistent uppkoppling mot SSH2-server.
http://www.lysator.liu.se/~nisse/lsh/lsh -G -N -l forsberg cvs.lysator.liu.se <lösenord> (lägg i bakgrunden) export CVS_RSH=lshg Kör!
- fsh är ett annat alternativ, men kräver installation på serversidan.
CVS på oebben
ViewCVS
- Exempelprojekt: LysCVS
- Används också på sourceforge.net
Moralkakeslide :-)
- Kolla vad du gjort innan incheckning.
cvs diff -u
C-x v =
- ALLTID beskrivande loggmeddelanden.
Sammanfattning
- Varför versionshantering?
- Vilka system finns?
- RCS
- CVS
- Diverse kringverktyg