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.
CVS on saatavilla ainakin seuraaville käyttöjärjestelmille:
- Unix (Linux, jne.)
- VMS
- Windows 95/NT
- OS/2
- Macintosh
- jne...
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.
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ä.
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äohjeita saa asennuksen jälkeen komennolla:$ info cvsLyhyen ohjeen saa komennolla:$ man cvsCVS:n laajemmat dokumenttitiedostot, kuten PostScript-muodoinen ohjekirja, sijaitsevat tyypillisesti hakemistossa /usr/doc/cvs-<versionumero>/.Tietoa on saatavilla myös osoitteista:
- Open Source Development With CVS - Karl Fogel
Erittäin kattava CVS-ohje, joka muodostaa suurimman osan samannimisestä kirjasta.
- http://www.cyclic.com/ - Cyclic Software
- http://www.loria.fr/~molli/cvs-index.html - CVS bubbles
Tämän ohjeen pienimmistäkin virheistä ja puutteellisuuksista saa valittaa allekirjoittaneelle.
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.
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 ~/.bashrcToinen 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.
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
CVS-istunto voidaan vastaavasti lopettaa komennolla~/src$ cvs logoutvaikkakaan tämä ei yleensä ole tarpeellista.
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.
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:
Merkki Selitys ? 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ä.
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).
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.
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.2 Muutettu 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.cTämä muuttaa munohjelma.c:n kuten alla oikealla, jossa on virhemerkinnöin rajattu oma muutos ja revisiossa 1.3 tehty vaihtoehtoinen muutos:
Muutettu B Virhemerkinnä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.
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ää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 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.
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 firstEli, 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.cCommitin voi tietysti antaa myöhemminkin, muiden toimintojen jälkeen. Katso alla sen kuvaus.
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 logsaa tulostettua kaikkien tiedostojen login, mikä voi olla aika pitkä.Katso myös: avainsanat.
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.
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):Tämän jälkeen tehdään commit kyseiselle tiedostolle:
/** * $Author$ $Date$ $Revision$ * * $Log$ * **/ #include <stdio.h> void main() { printf ("Hello, World!\n"); }~/src/projekti$ cvs commit -m "Lisäsin otsikkolohkon" munohjelma.cjolloin CVS päivittää tiedoston ja avaa otsikkolohkossa määritellyt avainsanat seuraavanlaisiksi: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ä.
/** * $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"); }
$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
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 projektiHieman 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.
Lyhyt maininta ominaisuuksista, joista tässä ohjeessa ei kerrota sen tarkemmin.
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.
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.
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.
CVS tukee kehityspuiden haarautumista (branching) ja jälleenyhdistämistä (merging).
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.
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 initTä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 pserverOlettaen, että cvs-ohjelma sijaitsee hakemistossa /usr/bin. Inetd käynnistetään nyt uudelleen komennolla:# /etc/rc.d/init.d/inet restart
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 cvsuserViimeinen 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.2G76kLopuksi 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
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 projektiKirjaamme 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 importHuomaa, 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 projektiTä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/modulesMuokkaa tiedostoa ja lisää rivi, joka määrittelee moduulin:projekti projektiEnsimmä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:
Toimita muutokset sitten palvelimelle ja poista CVSROOT-hakemisto:
-a alias vaihtoehtoinen nimi moduulille ~/src$ cvs commit -m "Module projekti added" CVSROOT/modules ~/src$ cvs release -d CVSROOT
CVS:n lähdekoodi on saatavissa osoitteista:http://www.cyclic.com/ - Cyclic Software
Ohjelmasta on myös erinäisiä RPM-paketteja ja muita Linuxille ja muille käyttöjärjestelmille.
http://www.loria.fr/~molli/cvs-index.html - CVS bubbles
Last modified: Sat Feb 17 01:08:31 EET 2001