Magi

Contact info
Word
Research
   Publications
Studies
Free Software
Hobbies
Articles
Photography
About me
   Curriculum Vitae

©Marko Grönroos, 1998

CVS:n asennus ja käyttö

Lyhyt oppimäärä

Marko Grönroos (magi@utu.fi)

1. Yleistä

CVS eli Concurrent Version System on versionhallintajärjestelmä, jonka avulla joukko kehittäjiä voi synkronisoida lähdekoodinsa.

Kullakin CVS:ää käyttävällä projektin ohjelmoijalla on oma kopionsa kaikista CVS:n hallitsemista tiedostoista. Tiedostoihin tehdyt muutokset toimitetaan (commit) CVS-palvelimelle, josta toiset käyttäjät taas voivat päivittää (update) ne itselleen aina kun haluavat.

CVS käyttää (sisäisesti ja täysin näkymättömästi) diff(1) ja patch(1) -ohjelmia (kts. man-sivut) päivitysten tekemiseen erityisellä yhdistysmenetelmällä. Tämän ansiosta jokainen ohjelmoija voi tehdä samanaikaisesti ja toisistaan riippumatta muutoksia omaan kappaleeseensa samasta tiedostosta, ilman että tiedostoa tarvitsee millään lailla lukita tai että muutoksia kopioiden välillä tarvitsisi siirtää välittömästi. Kannattaa kuitenkin huomata, että yhteen tiedostoon samanaikaisesti kohdistuneiden muutosten synkronisointi ei ole täysin idioottivarmaa, vaan muutokset saattavat johtaa ristiriitoihin, joiden selvittäminen on kuitenkin varsin yksinkertaista.

CVS käyttää pohjanaan RCS (Revision Control System) versionhallintajärjestelmää. Sen avulla on mikä tahansa aikaisempi (toimitettu) tilanne tiedostoista palautettavissa. Kehityksen voi myös haarauttaa (branching) kahteen tai useampaan kehityshaaraan, ja myöhemmin taas sulauttaa (merging).

Jos haluaa tarkempaa käyttäjätunnuskontrollia eri projektin välillä, voi jokaista sellaista projektia kohden, jolla on erillinen kehitysryhmä, luoda oman CVS-palvelimensa. Kuitenkin käytännössä, varsinkin jos kyseessä on GPL-projekteja ja oletetaan että kehittäjiin voi jossain määrin luottaa, kannattaa kaikkien projektien käyttää samaa palvelinta.

Yhteensopivuus

CVS on saatavilla ainakin seuraaville käyttöjärjestelmille:
  • Unix (Linux, jne.)
  • VMS
  • Windows 95/NT
  • OS/2
  • Macintosh
  • jne...

Versionumerointi

Jokaisella CVS-hallitulla tiedostolla on yksilöllinen versio- eli revisionumero. Numerointi alkaa tavallisesti numerosta 1.1, ja kasvaa 1.2, 1.3, ...

Tiedostokohtaisilla versio- eli revisionumeroilla ei ole mitään tekemistä ohjelman yleisen versionumeron eli julkaisunumeron kanssa, joka tyypillisellä uudelle projektilla voisi olla vaikkapa 0.1 tai 0.0.1, ja ensimmäisellä vakaalla versiolla 1.0.

Aputyökalut

Kehitysympäristöistä ainakin KDevelop ja Emacs tukevat CVS:ää jotenkuten. Niiden käyttöä ei tässä esitellä sen enempää, sillä komentoriviliittymälläkin pääsee jo melko pitkälle, ja aputyökalujakin käytettäessä tämän komentoriviliittymän tunteminen on hyödyksi.

CVS ei ole build-järjestelmä kuten make(1)+Makefile tai automake ja autoconf. Niitä voi kuitenkin käyttää sujuvasti CVS:n kanssa yhteistyössä.

Y2K

CVS käsittelee vuosilukuja kaksinumeroisina. Tämä voi aiheuttaa ongelmia, erityisesti vanhemmissa versioissa (ennen vuotta 1999 julkaistuissa). Yleisesti ottaen tämä ei kuitenkaan ole oleellinen ongelma.

Lisäohjeet

Lisäohjeita saa asennuksen jälkeen komennolla:
     $ info cvs
Lyhyen ohjeen saa komennolla:
     $ man cvs
CVS:n laajemmat dokumenttitiedostot, kuten PostScript-muodoinen ohjekirja, sijaitsevat tyypillisesti hakemistossa /usr/doc/cvs-<versionumero>/.

Tietoa on saatavilla myös osoitteista:

Tämän ohjeen pienimmistäkin virheistä ja puutteellisuuksista saa valittaa allekirjoittaneelle.


2. CVS:n käyttö

Seuraavassa kuvataan, miten CVS:n käyttäjä asentaa ympäristön itselleen, ja miten CVS:ää käytetään.

Tässä oletetaan, että CVS-ohjelmapaketti on asennettu käyttäjän koneeseen. Asiakasohjelma cvs on yleensä asennettu hakemistoon /usr/bin tai /usr/local/bin, eli sen pitäisi oletuksena löytyä polusta. Mikäli näin ei ole, katso asennusohjeet alla.


2.1. Käyttöönotto

Ensimmäiseksi pitää asettaa CVSROOT-ympäristömuuttuja, joka helpottaa cvs-komennon käyttöä huomattavasti. CVS-palvelimen ylläpitäjä yleensä kertoo tarkan CVSROOT:in henkilökohtaisesti. bash-kuoressa se asetetaan seuraavasti:

     export CVSROOT=":pserver:muntunnus@cvs.palvelin.fi:/usr/local/etc/cvsroot"

jossa muntunnus ja palvelimen nimi pitää asettaa CVS-palvelinta vastaaviksi. Palvelimen nimen jälkeen tuleva cvsroot-polku on sama kuin palvelimessa.

Mikäli käyttäjällä on käyttäjätunnus CVS-palvelinkoneella, voidaan käyttää myös esimerkiksi turvallista ssh:ta:

    export CVS_RSH="ssh"
    export CVSROOT="muntunnus@cvs.palvelin.fi:/usr/local/etc/cvsroot"
    
Mikäli käyttäjä tekee kehitystä samalla koneella kuin palvelin, voidaan käyttää suorempaa menetelmää:
     export CVSROOT=":local:/usr/local/etc/cvsroot"
Mikäli käyttää vain yhtä CVS-palvelinta, kannattaa ympäristömuuttujan asetus laittaa tiedostoon ~/.bashrc (mikäli käyttäjän kuorena on bash). tcsh-kuoressa vastaava tehdään setenv-komennolla ~/.cshrc-tiedostossa. Ympäristömuuttuja saadaan voimaan käynnistämällä uusi kuori, tai lukemalla muutettu asetustiedosto, bash:issä:
     $ source ~/.bashrc
Toinen vaihtoehto on antaa CVSROOT-polku cvs-ohjelmalle aina -d -lipulla.

CVS:n polun ja käyttäjätunnuksen pitäisi nyt olla oikein, ja ensimmäinen CVS-istunto voidaan aloittaa.


2.2. CVS-istunto - login...logout

CVS-istunto aloitetaan komennolla
     ~$ cd src
     ~/src$ cvs login projekti
     Logging in to muntunnus@cvs.palvelin.fi)
     CVS password: <tähän salasana jonka sait CVS-ylläpitäjältä>
     ~/src$
Ensimmäisellä login-kerralla tämä luo käyttäjälle projekti-alihakemiston, ja laittaa sinne CVS-versionhallintaan liittyvät alihakemistot (joihin ei saa koskea). Käyttäjän tulee heti tämän jälkeen tehdä checkout (kts. alla).

Huomionarvoista: Sisäänkirjautuminen tallentaa eri cvs-kohtaiden salasanat tiedostoon ~/.cvspass:

    ~/src$ cat ~/.cvspass
    :pserver:muntunnus@cvs.palvelin.fi:/usr/local/etc/cvsroot AZy'yZy=y
    :pserver:toinentunnus@toinen.projekti.fi:/data/cvs A'@as+fGs
    

Uloskirjautuminen - logout

CVS-istunto voidaan vastaavasti lopettaa komennolla
     ~/src$ cvs logout

vaikkakaan tämä ei yleensä ole tarpeellista.


2.3. Projektiin liittyminen - checkout

Oma kappale projektista päivitetään CVS-palvelinta vastaavaksi checkout-komennolla, joka tarvittaessa luo koko projektipuun nykyhakemiston alle:

     ~$ cd src
     ~/src$ cvs checkout projekti
     cvs server: Updating projekti
     U projekti/foo.txt
     U projekti/munohjelma.c
     U projekti/munohjelma.h
     cvs server: Updating projekti/common
     U projekti/common/pararr.h
     U projekti/common/table.h
     ~/src$
Katso rivin alussa olevien merkkien selitykset update-komennon ohjeesta.

Checkoutia käytetään yleensä vain projektiin liityttäessä, myöhemmin käytetään pääsääntöisesti updatea.

HUOMAA! Checkout tulee AINA tehdä projektihakemistoa ylemmässä hakemistossa. Jos sen tekee jossain muualla, luodaan koko CVS-hakemistopuu tuon toisen hakemiston alle, mikä tuskin on tarkoitus.


2.4. Synkronisoinnin tekeminen - update

update tekee päivityksen aivan kuten checkout, mutta sen voi tehdä CVS-hallitun kehityspuun missä alihakemistossa hyvänsä, ja se tekee päivityksen vain kyseisessä alipuussa. Päivityksen voi tehdä myös tiedostokohtaisesti, antamalla parametriksi päivitystä kaipaavat tiedostot.

     ~/src$ cvs update
     cvs server: Updating projekti
     ? projekti/Makefile
     U projekti/README
     M projekti/munohjelma.c
     M projekti/munohjelma.h
     cvs server: Updating projekti/common
     U projekti/common/pararr.h
     U projekti/common/table.h
     ~/src$
Rivien alussa olevien merkkikoodien merkitykset:
MerkkiSelitys
? paikallinen tiedosto, joka ei ole CVS-hallinnassa.
U tiedosto, johon päivitettiin muutoksia, tai uusi tiedosto. Jos nyt teemme muutoksia kyseisenlaiseen tiedostoon, muuttuu se M-tilaan (alla).
M tiedosto, jossa on paikallisia muutoksia. Muutokset päivitetään palvelimelle (ja sen kautta muille kehittäjille) vasta kun cvs commit -komento on annettu (kts. alla).
C ristiriitatilanne jonkun muun toimittaman väliversion ja paikallisen version välillä.

update -n vain tarkistaa palvelimelta, mitkä tiedostot ovat muuttuneet, muttei varsinaisesti tee päivitystä.


2.5. Muutosten toimittaminen - commit

CVS-hallittuihin tiedostoihin tehdyt paikalliset muutokset toimitetaan palvelimelle commit-komennolla. Esimerkiksi:
     ~/src/projekti$ jed myfile.c
     ...
     ~/src/projekti$ cvs commit -m "Lisäsin jutun X" myfile.c
     Checking in myfile.c;
     /usr/local/etc/cvsroot/projekti/myfile.c,v  <--  myfile.c
     new revision: 1.2; previous revision: 1.1
     done
     ~/src/projekti$ 
Tässä esimerkissä muokattiin vain yhtä tiedostoa myfile.c ja toimitettiin se palvelimen haltuun. Mikäli commitille ei anneta mitään tiedostonimeä, toimittaa se saman tien kaikki muutetut tiedostot, mikä yleensä on ehkä helpointakin.

Commitille tulee antaa kommentti -m -vivulla. Mikäli sitä ei anneta komentorivillä, käynnistää cvs tekstieditorin, johon kommentit voi kirjoittaa. Käytettävä editori määritellään CVSEDITOR- (ensisijainen), EDITOR- tai VISUAL-ympäristömuuttujilla (muutoin käytetään oletuksena vi:tä).

Yllä vilahtaa myös versionumerointia. Tiedostojen versionumerointi alkaa numerosta 1.1 ja kasvaa aina muutoksia tehtäessä.

Mikäli joku toinen on ehtinyt tehdä samaan tiedostoon muutoksia, jotka menevät päällekkäin itse tehtyjen muutosten kanssa, saattaa seurata ristiriitatilanne, jonka selvittäminen on kuitenkin suhteellisen helppoa (kts. alla).

Milloin toimittaa?

Toimituksia kannattaa tehdä "sopivan usein". Jos niitä tekee liian harvoin, ovat muut kehittäjät saattaneet tehdä paljon muutoksia tiedostoihin, mikä saattaa johtaa ristiriitoihin. Liian harvoin toimitettaessa muut kehittäjät eivät myöskään pääse hyötymään toisten tekemistä muutoksista tai varautumaan niihin. Usein pidetään käytäntönä, että ohjelman tulisi kääntyä toimitettaessa. Jotkin kehitysryhmät jopa testaavat tämän automaattisesti. Kehitysprojektin alkuvaiheessa se ei kuitenkaan usein ole tarpeellista.


2.6. Ristiriidat toimituksissa

Ristiriitoja saattaa tapahtua, kun useampi ohjelmoija muokkaa samaa tiedostoa samanaikaisesti. Ajatellaan esimerksi, että molemmat ovat lähteneet muokkaamaan versiota 1.2. Toinen toimittaa muutoksensa 1.3:ksi. Tämän jälkeen toinen ohjelmoija yrittää toimittaa omansa 1.4:ksi. Mikäli näiden kahden tekemät muutokset menevät tiedostossa päällekkäin - esimerkiksi kohdistuvat samoihin riveihin, seuraa ristiriitatilanne.

Otetaan esimerkiksi lyhyt ohjelma, jonka versioon 1.2 Kalle on tehnyt muutoksensa ja toimittanut ne versioksi 1.3:

Alkuperäinen 1.2Muutettu A -> 1.3
/**
 * $Author$ $Revision: 1.2 $
 * $Log$
 **/

#include <stdio.h>

void main() {
    printf ("Hello, World!\n");
}
/**
 * $Author: kalle $ $Revision: 1.3 $
 * $Log: munohjelma.c,v $
 * Revision 1.3  1999/11/12 02:21:12  kalle
 * Lisäsin paluuarvon main():iin
 **/

#include <stdio.h>

int main() {
    printf ("Hello, World!\n");
    return 0;
}

Nyt Jaska on myös tehnyt saman tiedoston revisioon 1.2 muutoksia (taulukossa alla vasemmalla), ja tekee heti muutosten jälkeen päivityksen saadakseen itselleen muiden tekemät muutokset, mutta siitä seuraa seuraavanlainen virhe:

    ~/src/projekti$ cvs update munohjelma.c
    RCS file: /usr/local/etc/cvsroot/projekti/munohjelma.c,v
    retrieving revision 1.2
    retrieving revision 1.3
    Merging differences between 1.2 and 1.3 into munohjelma.c
    rcsmerge warning: overlaps during merge
    cvs update: conflicts found in munohjelma.c
    C munohjelma.c
    
Tämä muuttaa munohjelma.c:n kuten alla oikealla, jossa on virhemerkinnöin rajattu oma muutos ja revisiossa 1.3 tehty vaihtoehtoinen muutos:

Muutettu BVirhemerkinnät
/**
 * $Author$ $Revision: 1.2 $
 * $Log$
 **/

#include <stdio.h>

void main(int argc, char* argv[]) {
    printf ("Hello, World!\n");
}
/**
 * $Author: kalle $ $Revision: 1.3 $
 * $Log: munohjelma.c,v $
 * Revision 1.3  1999/11/12 02:21:12  kalle
 * Lisäsin paluuarvon main():iin
 **/

#include <stdio.h>

<<<<<<< munohjelma.c
void main(int argc, char* argv[]) {
------- 
int main() {
>>>>>>> 1.3
    printf ("Hello, World!\n");
    return 0;
}

Konflikti korjataan muokkaamalla tiedosto oikeaksi ja poistamalla konfliktia osoittavat merkinnät. Samaista konfliktia ei enää tarkasteta kun tiedosto seuraavaksi toimitetaan, vaan commit luottaa, että tiedostoon on tehty vaaditut muutokset, kunhan tiedostoa on edes muutettu ristiriidan havaitsemisen jälkeen.


2.7. Tiedostojen lisääminen CVS-järjestelmään - add

Normaalisti käyttäjä saa luoda CVS-hakemistoonsa aivan mitä tiedostoja haluaa, eikä niitä oteta mukaan CVS-versionhallintaan ennen kuin seuraavat komennot annetaan.

Lisätään kaikki jossain hakemistossa olevat C-lähdekooditiedostot CVS:ään:

     ~/src$ cd projekti
     ~/src/projekti$ cvs add *.c *.h Makefile
     cvs server: scheduling file `munohjelma.c' for addition
     cvs server: scheduling file `munohjelma.h' for addition
     cvs server: scheduling file `Makefile' for addition
     cvs server: use 'cvs commit' to add this file permanently
     ~/src/projekti$ cvs commit -m "Lähdekoodit lisätty"
Muutokset toimitetaan CVS-palvelimelle vasta commit-komennolla, josta kerrottiin edellä.

Binääritiedostot

Binääritiedostoja lisättäessä annetaan add-komennolle -kb -lippu.

     ~/src/projekti$ cvs add -kb munbinaari.dat
     ~/src/projekti$ cvs commit -m "Datatiedosto lisätty"
Mikäli tiedosto on lisätty ilman kb-lippua, voi sen lisätä admin-komennolla:
     ~/src/projekti$ cvs add munbinaari.dat
     ~/src/projekti$ cvs commit -m "Datatiedosto lisätty"
     ~/src/projekti$ cvs admin -kb munbinaari2.dat
     ~/src/projekti$ cvs commit -m "Datatiedosto muutettu binääriksi"

Hakemistot

Hakemistot lisätään samoin kuin tiedostot:
     ~/src/projekti$ mkdir hakemisto
     ~/src/projekti$ cvs add hakemisto
     Directory /usr/local/etc/cvsroot/projekti/hakemisto added to the repository
Hakemistojen lisäyksiä ei tarvitse commitoida palvelimelle erikseen.

2.8. Tiedostojen ja hakemistojen poistaminen - remove

Tiedostoa tai hakemistoa ei voi poistaa vain CVS-käsittelystä, se täytyy ensin poistaa myös levyltä. Muutoin käy seuraavasti:
     ~/src/projekti$ cvs remove munohjelma.c
     cvs server: file `munohjelma.c' still in working directory
     cvs server: 1 file exists; remove it first
Eli, se pitää poistaa:
     ~/src/projekti$ rm munohjelma.c
     ~/src/projekti$ cvs remove munohjelma.c
     cvs server: scheduling `munohjelma.c' for removal
     cvs server: use 'cvs commit' to remove this file permanently
     ~/src/projekti$ cvs commit -m "poistin vaan tiedoston" munohjelma.c
Commitin voi tietysti antaa myöhemminkin, muiden toimintojen jälkeen. Katso alla sen kuvaus.


2.9. Kommenttilokin selaaminen - log

CVS:ään tehtyjen päivitysten historiaa, sekä niihin liittyviä, commit-komennolle annettuja kommentteja, pääsee katsomaan log-komennolla:
     ~/src/projekti$ cvs log munohjelma.c
     RCS file: /usr/local/etc/cvsroot/projekti/munohjelma.c,v
     Working file: munohjelma.c
     head: 1.3
     branch:
     locks: strict
     access list:
     symbolic names:
     keyword substitution: kv
     total revisions: 3;     selected revisions: 3
     description:
     ----------------------------
     revision 1.3
     date: 1999/11/11 23:28:58;  author: muntunnus;  state: Exp;  lines: +1 -3
     poistin vaan tiedoston
     ----------------------------
     revision 1.2
     date: 1999/11/11 19:22:39;  author: muntunnus;  state: Exp;  lines: +1 -0
     tein toisenkin muutoksen
     ----------------------------
     revision 1.1
     date: 1999/11/11 17:04:59;  author: muntunnus;  state: Exp;
     lisäsin jutun X
     =============================================================================
Kirjoittamalla
     ~/src/projekti$ cvs log
saa tulostettua kaikkien tiedostojen login, mikä voi olla aika pitkä.

Katso myös: avainsanat.


2.10. Tiedostojen muutosten tarkastelu - annotate

Annotate-komennolla voi tarkastella kaikkia tiedostoihin tehtyjä muutoksia:
    ~/src/projekti$ cvs annotate munohjelma.c
    Annotations for munohjelma.c
    ***************
    1.1          (muntunnus     11-Nov-99): #include <stdio.h>
    1.1          (muntunnus     11-Nov-99):
    1.3          (jokutoinen    11-Nov-99): #include "wwlib/wwmap.h"
    1.1          (muntunnus     11-Nov-99): #include "common/pararr.h"
    1.1          (muntunnus     11-Nov-99):
    1.2          (muntunnus     11-Nov-99): void main() {
    1.1          (muntunnus     11-Nov-99):      printf ("Hello, World!\n");
    1.2          (muntunnus     11-Nov-99): } /** main() */ 
    1.1          (muntunnus     11-Nov-99):
    
Tässä esimerkissä version tiedoston tila oli sellainen kuin 1.1-rivit osoittavat. Sen jälkeen siihen tehtiin muutoksia riveillä, jotka on merkitty versionumerolla 1.2.

Ilman tiedostoparametria annotate tulostaa kaikki tiedostot.

Katso myös: diff.


2.11. Avainsanat lähdekoodissa

Monia CVS:n tiedostokohtaisia asioita saa automaattisesti näkyviin tiedostojen otsikkolohkoissa. Muokkaamme tiedostoa munohjelma.c ja lisäämme siihen seuraavanlaisen otsikkolohkon (jossa normaalisti voisi olla myös esimerkiksi copyright-tietoja):
    
    /**
     * $Author$ $Date$ $Revision$
     *
     * $Log$
     *
     **/
    
    #include <stdio.h>
    
    void main() {
        printf ("Hello, World!\n");
    }
Tämän jälkeen tehdään commit kyseiselle tiedostolle:
    ~/src/projekti$ cvs commit -m "Lisäsin otsikkolohkon" munohjelma.c
    
jolloin CVS päivittää tiedoston ja avaa otsikkolohkossa määritellyt avainsanat seuraavanlaisiksi:
    
    /**
     * $Author: muntunnus $ $Date: 1999/11/12 17:33:29 $ $Revision: 1.8 $
     *
     * $Log: munohjelma.c,v $
     * Revision 1.4  1999/11/12 02:21:12  muntunnus
     * Lisäsin otsikkolohkon
     *
     * Revision 1.3  1999/11/11 23:28:58  muntunnus
     * poistin vaan tiedoston
     *
     * Revision 1.2  1999/11/11 19:22:39  muntunnus
     * tein toisenkin muutoksen
     *
     * Revision 1.1  1999/11/11 17:04:59  muntunnus
     * lisäsin jutun X
     *
     **/
    
    #include <stdio.h>
    
    void main() {
        printf ("Hello, World!\n");
    }
Mikäli otsikkolohkoon keertyy tarpeettomia lokiviestejä, voi ne surutta poistaa käsin, eikä CVS enää palauta niitä takaisin. Uudet toimituskommentit siis vain lisätään ensimmäiseksi vanhojen eteen, vanhoista mitenkään välittämättä.

Kaikki avainsanat

$Author$ Viimeisimmän version toimittaja
$Date$ Päivämäärä ja aika milloinka viimeinen toimitus tehtiin
$Header$ Vakio-otsikkorivi, jossa yhdistelmä muiden kenttien tietoja
$Id$ Sama kuin $Header$, mutta tiedostonimi on ilman polkua
$Name$ Tiedoston toimittamiseksi käytettävä ''taginimi''
$Locker$ Käyttäjä joka on parhaillaan lukinnut tiedoston
$Log$ Toimitusten yhteydessä annettujen viestien loki
$Revision$ Versionumero
$Source$ Tiedoston täysi (,v-loppuinen) RCS-tiedostonimi palvelimella
$State$ Versioon liittyvä tila, joka on asetettu admin-komennolla

2.12. Projektista poistuminen - release

Siinä vaiheessa, kun lakkaa työskentelemästä jonkin CVS-ylläpidetyn projektin kanssa, ja haluaa poistaa kopion itseltään, tapahtuu se yksinkertaisesti:
     ~/src$ rm -rf projekti
Hieman parempi tapa on antaa komento:
     ~/src$ cvs release -d projekti
     M munohjelma.c
     ? projekti
     You have altered 1 files in this repository.
     Are you sure you want to release (and delete) directory 'projekti': n
     ** 'release' aborted by user choise.
joka -d -lipulla tuhoaa projektiin liittyvän hakemistopuun. Tässä esimerkissä yhtä tiedostoa (munohjelma.c) oli muutettu.


3. Muita ominaisuuksia

Lyhyt maininta ominaisuuksista, joista tässä ohjeessa ei kerrota sen tarkemmin.

3.1. Tiedostonmuokkauksen tarkkailu ja lukitukset - watch

watch-komennolla voi tarkkailla, kuka tiedostoja muokkaa. Se myös pakottaa ohjelmoijat lukitsemaan tiedostot muokkauksen ajaksi. Tällöin jokaisen muokkaajan on aloitettava muokkaus edit-komennolla ja annettava muokkauksen päätyttyä unedit-komento.

3.2. Tagit - tag

Projektin eri tiedostojen versionumerot ovat yleensä aina täysin erilaiset. Tagien käyttö on tapa antaa yhden tai useamman tiedoston tietylle versionumerolle symbolinen nimi. Esimerkiksi, jos jonain kehityksen hetkenä munohjelma.c ja munohjelma.h kääntyvät yhdessä hyvin, voidaan niille antaa jokin nimetty tagi, kuten kaantyy-1-3. Vanhaan hetkeen voidaan palata tuon tagin perusteella.

3.3. Erot versioiden välillä - diff

cvs diff-komennolla voi muodostaa .patch-tiedostoja eri revisioiden välillä. Näiden tiedostojen ja patch(1)-ohjelman avulla voi päivittää lähdekoodipuita, jotka ovat CVS-hallinnan ulkopuolella.

Kätevä tapa on tulostaa viimeaikaisia muutoksia tiedostoihin -u -lipulla, joka merkitsee muutokset + ja - -merkeillä:

    ~/src/projekti$ cvs diff -u -r 1.2 README |less
    Index: README
    ===================================================================
    RCS file: /usr/local/etc/cvsroot/projekti/README,v
    retrieving revision 1.2
    diff -u -r1.2 README
    --- README      1999/11/11 19:22:39     1.2
    +++ README      1999/11/13 17:58:58
    @@ -1,3 +1,4 @@
    -Some readme
    -ja lisää
    +$Author: muntunnus $ $Date: 1999/11/13 17:55:03 $ $Revision: 1.4 $
    
    +Kirjoitin tähän nyt pari riviä lisää.
    +Jeee.
    
Tässä tapauksessa README-tiedostosta on revision 1.2 (joka kerrottiin -r-lipulla) jälkeen jossain vaiheessa poistettu miinus-merkillä merkityt rivit "Some readme" ja "ja lisää", ja lisätty plus-merkillä merkityt rivit.

3.4. Haarautuminen

CVS tukee kehityspuiden haarautumista (branching) ja jälleenyhdistämistä (merging).

3.5. Palvelimen komentoskriptit

CVS-palvelimen voi asettaa ajamaan komentoskriptejä aina tiettyjen CVS-komentojen yhteydessä. Ne voivat esimerkiksi tehdä tiettyjä tarkastuksia toimitettavien (commit) tiedostojen sisällöstä tai toimituskommenteista, ja hylätä toimituksen mikäli ne eivät kelpaa.


4. Palvelimen asennus

CVS-versionhallinnalle pitää luoda hakemisto, esimerkiksi /usr/local/etc/cvsroot, jota kutsumme tästä lähtien nimellä $CVSROOT. Tämän jälkeen ajetaan komento:
    # cvs -d /usr/local/etc/cvsroot init
Tämä luo hakemistoon CVS:n omat tiedot sisältävän hakemiston CVSROOT. Nyt laitetaan CVS-palvelin inetd:n ajettavaksi. Editoidaan tiedostoa /etc/inetd.conf ja lisätään sinne rivi:
    2401 stream tcp nowait root /usr/bin/cvs cvs --allow-root=/usr/local/etc/cvsroot pserver
Olettaen, että cvs-ohjelma sijaitsee hakemistossa /usr/bin. Inetd käynnistetään nyt uudelleen komennolla:
     # /etc/rc.d/init.d/inet restart


4.1. Käyttäjätunnuksen luonti

Seuraavaksi tarvitaan yksi käyttäjä, joka luodaan seuraavasti. Oletetaan, että haluamme CVS-käyttäjille erilliset salasanat (sen sijaan että heillä olisi normaalit unix-käyttäjätunnukset). Käyttäjätunnusten ja kryptattujen salasanojen luontiin ei ole erillistä ohjelmaa, joten sen voi tehdä seuraavanlaisella virityksellä:
     # useradd cvsuser
     # passwd cvsuser
     New UNIX password: <kirjoita salasana tähän>
     Retype new UNIX password: <<kirjoita salasana uudelleen>
     # tail -1 /etc/passwd >> /usr/local/etc/cvsroot/CVSROOT/passwd
     # userdel cvsuser
Viimeinen rivi poistaa turhan käyttäjätunnuksen. Nyt $CVSROOT/CVSROOT-hakemistossa oleva tiedosto passwd näyttää esimerkiksi tältä:
     cvsuser:50cU1QG.2G76k:501:512::/home/cvs:/bin/bash
''cvsuser'' on tässä käyttäjätunnus, joka voidaan muuttaa halutuksi. Käyttäjätunnusta seuraa salasana. Muutetaan käyttäjätunnus ja poistetaan kaikki salasanan jälkeinen editoimalla tiedostoa:
     muntunnus:50cU1QG.2G76k
Lopuksi kerrotaan käyttäjälle hänen salasana salasanansa, sekä CVS-polku, jonka hän voi asettaa ympäristömuuttujaan kuten edellä kuvattiin.

     export CVSROOT=:pserver:muntunnus@cvs.palvelin.fi:/usr/local/etc/cvsroot

4.2. Projektien eli moduulien lisääminen

CVS-projektin aloittaminen on melko avointa, mutta joudumme hieman kikkailemaan siinä. Aloitamme luomalla uuden projektin alusta. Luomme projektihakemiston käyttäjän hakemistoon:
     ~/src$ mkdir projekti
Kirjaamme uuden projektin CVS:ään import-komennolla. import-komento vaatii parametrikseen projektihakemiston nimen, tekijämerkin ja julkaisumerkin. Annamme tekijämerkiksi käyttäjän käyttäjätunnuksen ja julkaisumerkiksi start.
     ~/src$ cd projekti
     ~/src/projekti$ cvs import -m "Lisätty projekti" projekti käyttäjätunnus start
     No conflicts created by this import
Huomaa, että tämä vaatii $CVSROOT-hakemistoon kirjoitusoikeudet.

HUOMAA! Mikäli tässä projektihakemistossa on jotain tiedostoja, ne kaikki lisätään luotuun projektiin. Mikäli kyseessä on vanha projekti, lisätään siis aivan kaikki tiedostot, myös paljon sellaisia mitä ei välttämättä haluaisi!

Nyt hakemisto täytyy kuitenkin poistaa, koska muuten CVS ei huomaa tehdä sinne CVS-hakemistoa:

     ~/src/projekti$ cd ..
     ~/src rmdir projekti
     ~/src cvs checkout projekti
     cvs server: Updating projekti

Tämän lisäksi pitää muokata palvelimen modules-tiedostoa. Se haetaan seuraavasti (oletetaan että ollaan jo kirjauduttu CVS:ään)

     ~/src$ cvs checkout CVSROOT/modules
     ~/src$ jed CVSROOT/modules
Muokkaa tiedostoa ja lisää rivi, joka määrittelee moduulin:
     projekti projekti
Ensimmäinen parametri on moduulin nimi, toinen hakemiston nimi. Tällä tapauksessa, ja kenties useimmiten, hakemiston nimi on sama kuin moduulin nimi.

Moduulien määrittelyriveille voi antaa myös parametreja:

    -a alias vaihtoehtoinen nimi moduulille
Toimita muutokset sitten palvelimelle ja poista CVSROOT-hakemisto:
     ~/src$ cvs commit -m "Module projekti added" CVSROOT/modules
     ~/src$ cvs release -d CVSROOT


Liite A: CVS-paketin asennus

CVS:n lähdekoodi on saatavissa osoitteista: Ohjelmasta on myös erinäisiä RPM-paketteja ja muita Linuxille ja muille käyttöjärjestelmille.

Pääsivu Takaisin Last modified: Sat Feb 17 01:08:31 EET 2001