CVS on lyhenne sanoista Concurrent Versions System ja se sallii esimerkiksi monen käyttäjän muokata samaa tiedostoa samanaikaisesti. Versionhallintajärjestelmän käytöstä on myös muita etuja, mutta tämän projektin kannalta edellämainittu lienee selvästi suurin.
CVS:ssä materiaali tallennetaan keskitettyyn emokopioon (repository). Kun materiaalia halutaan muokata, siitä tehdään paikallinen kopio sille koneelle, jolla muokkaus tehdään. Muutokset tehdään paikalliseen kopioon, minkä jälkeen ne päivitetään myös emokopioon. CVS-järjestelmä pitää huolen siitä, etteivät eri käyttäjien tekemät muutokset mene toistensa päälle. Vaikka varsinainen työ tehdään paikallisille tiedostoille, CVS:llä on siis merkittävä osa työskentelyssä.
CVS toimii (perustapauksessa) ilman suoranaisia asiakas- ja palvelinohjelmistoja. Sen sijaan cvs-ohjelma käsittelee emokopiota suoraan. Näin ollen käytettäessä CVS:ää laitoksen koneilla ei tarvita verkkoyhteyksiä (ainakaan sellaisia, joista käyttäjän pitäisi välittää) eikä myöskään erillisiä salasanoja CVS:n käyttöön, vaan kirjoitusoikeus CVS:n juurihakemistoon riittää.
CVS-työkalulle täytyy kuitenkin kertoa, missä emokopio sijaitsee. Projektimme ns. CVS-juuri on /home/group/mozart/cvsroot/. Sijainnin voi kertoa CVS-työkalulle asettamalla CVSROOT-nimisen ympäristömuuttujan osoittamaan siihen. Esimerkiksi bash-komentotulkissa se onnistuu komennolla
export CVSROOT="/home/group/mozart/cvsroot/"
CVS:ää voi käyttää myös verkon yli ssh:n avulla. Tällöin juurihakemiston lisäksi pitää asettaa tietoja etäyhteyden käytöstä. CVS:n voi eksplisiittisesti asettaa käyttämään ulkoista emokopiota sijoittamalla CVSROOT-muuttujan arvon eteen määreen :ext:. Tämä määrää CVS:n käyttämään rsh:ta (remote shell) emokopion käsittelyssä. Lisäksi voi joutua asettamaan ympäristömuuttujan CVS_RSH=ssh asettaakseen eksplisiittisesti CVS:n käyttämään etäyhteyteen ssh:ta. Lisäksi CVSROOT-muuttujassa on ilmaistava paitsi edellämainittu sijainti tiedostojärjestelmässä myös emokopion sisältävän etäkoneen osoite sekä käyttäjätunnus, jos se ei ole sama kotikoneellasi ja laitoksella.
Seuraavilla komennoilla pitäisi siis saada CVS toimintaan vaikkapa kotikoneelta SSH:n yli:
export CVS_RSH=ssh export CVSROOT=":ext:<tunnus>@melkki.cs.helsinki.fi:/home/group/mozart/cvsroot"
Korvaa <tunnus> laitoksen käyttäjätunnuksellasi ja halutessasi melkki jollakin toisella TKTL:n palvelimella, vaikkapa melkinkarilla tai melkinpaadella.
Näin siis sanoo CVS:n dokumentaatio ja myös monet muut lukemani ja kuulemani ohjeet. Minulla etäyhteys tosin näyttää toimivan myös ilman :ext:-määrettä, ja jostain syystä sen käyttäminen jopa saa CVS:n kyselemään salasanaa kahteen kertaan yhtä CVS-siirtoa kohden, kun taas ilman lisämäärettä (mutta CVSROOTissa asetetun user@host-parin sekä CVS_RSH:n kanssa) sitä kysytään vain kerran. Nähtävästi myös ainakin joillakin muilla käyttäjillä yhteys on toiminut ilman lisämäärettä.
Jotta muuttujia ei tarvitse asettaa aina erikseen avattuaan terminaalin, komennot kannattaa ehkä sijoittaa aina komentotulkin käynnistyksessä suoritettavaan skriptiin, vaikkapa .bashrc-tiedostoon.
Perustettaessa paikallista kopiota ensimmäisen kerran käytetään checkout-komentoa. Tämä kopioi koko annetun moduulin (hakemiston) emokopiosta omaan kotihakemistoon.
Luo hakemisto, johon haluat paikallisen kopiosi juuren sijoittuvan, ja siirry siihen. Koko projektimme on moduulissa nimeltä mozart, joten saat ladattua sen työhakemistoosi komennolla
cvs checkout mozart
Kun paikallinen kopio on perustettu, sen voi päivittää emokopiosta update-komennolla paikallisen kopion juurihakemistossa. Lisäämällä komennon loppuun valitsimen -d saa CVS:n hakemaan myös mahdolliset edellisen päivityksen jälkeen luodut uudet hakemistot:
cvs update -d
CVS:ään lisätään uusi tiedosto luomalla se omaan paikalliseen kopioon CVS:stä ja suorittamalla komento
cvs add <tiedostonimi>
Lisäksi, jotta muutoksesta tulisi pysyvä myös emokopioon, on ajettava komento
cvs commit
Uusia hakemistoja voi lisätä samaan tapaan.
Kun haluat muokata tiedostoa, päivitä ensin oma kopiosi update-komennolla. Muokkaa sitten kopiotasi tiedostosta tavalliseen tapaan. Testaa muutokset ennen tallettamista CVS:ään. Kun olet valmis päivittämään muutoksesi emokopioon, suorita
cvs commit
Commit-komennolle voi myös antaa emokopioon päivitettävän tiedoston nimen, jos haluaa tallentaa vain nimenomaisesti yhden tiedoston. Lisäksi voi olla hyvä päivittää oma kopio update-komennolla ennen commitia. Tällöin CVS havaitsee mahdolliset ristiriidat muiden samanaikaisesti tekemien muokkausten kanssa jo tässä vaiheessa.
Aina emokopioon tehtävien muutosten yhteydessä CVS pyytää selvityksen tehdyistä muutoksista. Muutosten kuvauksen voi antaa jo komentoriviltä commit-käskyn yhteydessä parametrilla -m. Esimerkiksi korjattuaan ongelman lähdekooditiedostossa Kotkotin.java muutokset voisi tallettaa CVS:ään seuraavasti:
cvs commit -m "Korjattu null pointer -bugi metodissa pulauta()" Kotkotin.java
Jos kuvausta ei anna komentorivillä, CVS käynnistää tekstieditoriin väliaikaistiedoston. Muutoksen kuvaus kirjoitetaan tekstin alkuun, ja väliaikaistiedosto tallennetaan ja editori suljetaan. CVS liittää kirjoitetun kuvauksen päivitettävän tiedoston muutoslokiin.
TKTL:llä CVS tarjoaa ilmeisesti oletuksena µEmacsia muutoslokien kirjoittamiseen. Käytettävää editoria voi vaihtaa asettamalla CVSEDITOR-ympäristömuuttujan. µEmacsissa tiedoston voi tallentaa ja editorin sulkea näppäinyhdistelmällä Esc-Z.
Tiedoston koko muutoslokin voi lukea komennolla
cvs log <tiedostonimi>
Lokista näkee myös tiedoston kaikkien revisioiden nimet. Jos haluaa nähdä tarkemmin, mitä muutoksia kahden revision välillä on tehty, voi käyttää cvs diff -komentoa. Parametrilla -r voi määrätä tarkasteltavat revisiot. Esimerkiksi muutokset revisioiden 1.4 ja 1.5 välillä näkee seuraavasti:
cvs diff -r 1.4 -r 1.5 <tiedostonimi>
Jos revisioita ei mainita, cvs esittää eron emokopion version ja oman kopion välillä. Näin voit katsella muutoksia, jotka olet tehnyt viimeisimmän suorittamasi update-komennon jälkeen:
cvs diff <tiedostonimi>