Versionshantering för den yrvakne

Versionshantering för den yrvakne

Eller: Hur jag slutade oroa mig och började älska versioner

Erik Forsberg, Lysator ACSLysator Logo

forsberg@lysator.liu.se
http://www.lysator.liu.se/~forsberg/
http://www.lysator.liu.se/~forsberg/rawlab2002-03/versionshantering.html

Agenda

Ställ frågor!

Vad är versionshantering?

Varför versionshantering?

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

Vilket versionshanteringssystem vid vilket tillfälle?

Begrepp

RCS - Revision Control System

RCS - hur funkar det?

RCS - hur använder jag det

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:

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.c
Filen 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!!!

  • Lugna dig - emacs kan också :-)
    • 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.
  • Din grafiska WYSINWYG-editor kan med lite tur också versionshantering.

    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!
    Användbart för att hålla ordning på vilken version man diskuterar över telefon..

    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 LOVE YOU

     

     

    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
    done
    
    Om 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 ms
    
    Inget 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.c
    
    Filen ä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>
    Filen kan senare återskapas om så önskas.

    Å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,v
    
    Administrativa 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.
    Editering av administrativa filer sker genom att man checkar ut katalogen CVSROOT, editerar filerna och checkar in dem igen.

    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
      1. Skapa en katalogstruktur, eller använd en existerande.
      2. Kör 'cvs import' med argument.
      3. Gå till en annan katalog.
      4. Checka ut den nyligen importerade modulen.
      5. 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.

    Branch example

    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

    Oebbadresser