Versionhallintajärjestelmät

Versionhallintajärjestelmiä versiohallintaan on useita, sekä avoimen lähdekoodin että kaupallisia, suljettuja toteutuksia.
Myös eräiden käyttöjärjestelmien tiedostojärjestelmä tukee läpinäkyvästi tiedostojen versiointia (). Tässä ei ole niitä käsitelty.
Osa järjestelmistä on aloittanut suljettuna kaupallisena toteutuksena ja myöhemmin lähdekoodit on julkaistu.
Nykyinen suuntaus on kehittää hajautettuja versionhallintajärjestelmiä, joita edustavat Git, Mercurial ja Bazaar.
== Järjestelmien luokittelu ==
Versionhallintajärjestelmät voidaan jakaa kolmeen sukupolveen seuraavasti:
# yksittäiset tiedostot, ei verkottamista: RCS, SCCS
# useampia tiedostoja, keskitetyt palvelimet: CVS, Subversion
# muutosjoukkoja, hajautetut palvelimet: Git, GNU Bazaar, Mercurial
Ensimmäisen sukupolven versiohallintajärjestelmät käsittelivät tiedostoja yksi kerrallaan.
Toinen sukupolvi osaa käsitellä useampia tiedostoja ja tukee verkottumista.
Kolmas sukupolvi tukee muutosjoukkoja (), jossa muutokset ovat jakamattomia useamman tiedoston kattavia muutoksia: tietty muutos voi vaatia muutoksen useampaan tiedostoon yhtä aikaa eikä ole sallittua jakaa eri päivityksiin.
== SCCS ==
Source Code Control System (SCCS) on yksi varhaisista versiohallintajärjestelmistä. Se on kehitetty vuonna 1972 Bell Labs:ssa IBM System/370 tietokoneelle.
SCCS:lle on tehty avoimen lähdekoodin korvike GNU CSSC sekä POSIX-yhteensopiva versio.
==RCS==
RCS on yhden käyttäjän vapaa versiohallintajärjestelmä.Tichy, W. F.: Rcs – a system for version control. Software-Practice & Experience, 15(7), 1985, 637–654. Sen kehityksen aloitti Walter
Tichy 1980-luvun alkupuolella Purduen yliopistossa Yhdysvalloissa.
RCS on kehitetty Source Code Control Systemin (SCCS) pohjalta.Rochkind, M.J.: The Source Code Control System, IEEE Transactions on Software Engineering, Volume 1(4), 1975, 364–370. Siihen verrattuna RCS
toimii tehokkaammin säilyttämällä kustakin tiedostosta uusimman version kokonaisuudessaan sekä aikaisemmista versioista vain niiden eroavaisuudet seuraavaan
verrattuna. Hallittavat tiedostot voivat ohjelmakoodin lisäksi olla mitä tahansa dokumentteja.
RCS käyttää historiallista ja loogista versiointia. Versiointi on toteutettu puurakenteella tallentaen dokumenteista vain viimeisimmät versiot kokonaisuudessaan. Sivuhaaroista tallennetaan
eroavaisuudet rekursiivisesti haarautumiskohdasta lähtien. Näin päähaaran uusin versio on nopeasti saatavilla, eikä uuden version lisääminen vaadi kuin sen tallentamisen sekä uuden deltan muodostamisen edeltävää versiota varten. Versioiden eroavaisuuksien tunnistamiseen käytetään diff-ohjelmaa.
Versioiden identifiointi tapahtuu RCS:ssä historiallisen versioinnin tapauksessa kuten aiemmin on kuvattu. Tasonumerointi toimii automaattisesti siten, että uusi versio saa yhtä suuremman numeron edelliseen verrattuna. Halutessaan käyttäjä voi suurempien muutoksien jälkeen kasvattaa myös julkaisunumeroa. Myös loogisessa versioinnissa eli puun haarautuessa, versiot tunnistetaan numeroiden perusteella. Jos esimerkiksi versiosta 1.3 luodaan haara, sille annetaan numero 1.3.1. Varsinaisen haaraan kuuluvan version tunnukseen kuuluu vielä neljäs numero, joka muodostetaan tasonumeroinnin tapaan. Haaran 1.3.1 versioita ovat esimerkiksi 1.3.1.1 ja 1.3.1.2. Jos versiosta 1.3 luodaan uusi, erillinen haara, se saa numeron 1.3.2.
RCS:n peruskäyttöön tarvitaan vain komennot ci ja co. Komento ci tiedosto.c lisää järjestelmään uuden tiedoston. Komennolla co tiedosto.c tiedoston voi hakea järjestelmästä muokattavaksi. Muokkauksen tuloksena syntynyt uusi versio lisätään puuhun komennolla ci tiedosto.c.
Jos RCS:llä on useita käyttäjiä, käyttäjän tulee aina lukita versio ottaessaan sen muokattavaksi. Tästä seuraa RCS:n suurin ongelma; kutakin tiedostoa voi muokata vain yksi käyttäjä kerrallaan, vaikka eri henkilöt muokkaisivat eri osia tiedostosta. Pakottavassa tilanteessa lukitus on mahdollista murtaa, mutta tästä seuraa helposti ongelmia.
Lisäksi RCS käsittelee vain yksittäisiä tiedostoja, vaikka useimmissa tapauksissa ohjelmiston versio muodostuu useiden lähdekooditiedostojen kokonaisuudesta.
RCS ei myöskään tarjoa minkäänlaisia verkko-ominaisuuksia, vaan usean kehittäjän projektissa tiedostot tulee hakea siltä koneelta, jossa järjestelmä sijaitsee. Näin ollen RCS ei ole joustava järjestelmä suuremmissa usean kehittäjän projekteissa.
==CVS==
CVS on RCS:n pohjalle rakennettu vapaa monen käyttäjän versiohallintajärjestelmä.
Järjestelmän kehitys lähti liikkelle Dick Grunen 1986 julkaisemista shell-skripteistä,
jotka helpottivat RCS:n käyttöä. Nykyisessä järjestelmässä kyseistä koodia ei enää
ole jäljellä, mutta CVS:n käyttämät konfliktinhallinta-algoritmit ovat pääosin sieltä
peräisin. Varsinaisen CVS:n ensimmäisen version suunnitteli ja ohjelmoi C-kielellä
Brian Berliner vuonna 1989.
CVS tallentaa tiedostojen versiot samaan tapaan kuin RCS, ja CVS:n ensimmäiset
versiot itse asiassa käyttivät tähän RCS:n ominaisuuksia. CVS kuitenkin pitää kirjaa
tiedostojen sijaintihakemistosta ja osaa yhdistää useita hakemistoja yhdeksi kokonaisuudeksi.
Näin pystytään hallitsemaan yhtenäistä, useista tiedostoista koostuvaa
projektia. Lisäksi CVS mahdollistaa yhteistoiminnallisen versioinnin,
sillä revisiopuuhun luotu haara on myöhemmin mahdollista yhdistää päähaaraan.
CVS tekee eron version ja revision välillä. Revisiot ovat versioita yksittäisestä tiedostosta ja ne numeroidaan samaan tapaan kuin RCS:ssä. Versio sen sijaan tarkoittaa
koko sovelluksen versiota, joka koostuu usean tiedoston revisioista. Tällainen versio
voidaan määritellä esimerkiksi annettaessa sovellus asiakkaalle testattavaksi.
CVS ei estä useita kehittäjiä muokkaamasta samaa tiedostoa yhtä aikaa, vaan
järjestelmä osaa yhdistää eri kehittäjien tekemät muutokset. 1990-luvun alussa järjestelmään lisättiin myös verkko-ominaisuudet, jolloin projektin tuotoksiin saattoi
tarvittaessa päästä käsiksi kaikkialta Internetistä. Juuri näinä aikoina CVS saavutti
runsaasti suosiota erityisesti vapaan ohjelmistonkehityksen piirissä.
Työskentely CVS:ää käyttäen tapahtuu niin sanotun kopioi-muokkaa-yhdistä -mallin
mukaisesti (vrt. RCS:n käyttämä lukitse-muokkaa-vapauta -malli). Yksinkertaisimmillaan
työskentelyyn kuuluu kolme vaihetta. Ensimmäisessä vaiheessa projektista
ladataan niin sanottu työkopio lokaalille koneelle. Tätä tapahtumaa kutsutaan
nimellä check out. Toisessa vaiheessa projektin työkopiota voidaan muokata vapaasti
CVS:stä riippumatta ja kolmannessa vaiheessa työkopioon tehdyt muutokset kirjataan
CVS:ään. Muutosten kirjaamista CVS:ään kutsutaan nimellä commit. Muutosten
kirjaamisen jälkeen muutokset ovat näkyvissä kaikille projektin kehittäjille,
jotka kukin kehittäjä voi edelleen päivittää omiin työkopioihinsa.
==Subversion (SVN)==
Subversion on vapaa versiohallintajärjestelmä, jonka tarkoitus on ennen kaikkea
korjata CVS:ssä havaittuja puutteita ja lisätä CVS:stä puuttuvia, mutta yleisesti
tarpeellisiksi koettuja ominaisuuksia. Subversion on rakennettu CVS:n pohjalta,
minkä takia Subversionin toiminta ja käyttö ovat monella tapaa samantyylisiä
CVS:ään verrattuna.
Subversion mahdollistaa hakemistojen, tiedostojen uudelleennimeämisten ja tiedostoihin
liittyvän metadatan versioinnin. Näin esimerkiksi tiedoston nimen tai
attribuuttien muuttaminen tulkitaan muutokseksi samaan tapaan kuin tiedoston
sisällön muuttaminen.
Commit-toiminto tulee Subversionissa voimaan vasta kun toiminto on kokonaisuudessaan
suoritettu. Toimintoa käsitellään yhtenä kokonaisuutena, joka saa oman versionumeronsa.
Tämän seurauksena yksittäisillä muutoskerroilla tehtyjä muutoksia
voidaan seurata kokonaisuutena.
Subversionissa versioiden tallentamiseen voi puhtaasti tiedostopohjaisen varaston
sijaan käyttää myös BerkeleyDB-tietokantaa. Lisäksi Subversionissa on tehostettu
loogiseen versiointiin liittyvää haarojen muodostamista ja käsittelyä, verkon yli
tapahtuvaa toimintaa sekä binääritiedostojen käsittelyä.
==GNU arch==
GNU arch on avoimen lähdekoodin hajautettu versionhallintajärjestelmä, jonka kehitys on päättynyt.
GNU arch on vaikuttanut useiden muiden versionhallintajärjestelmien kehitykseen kuten Git, Mercurial ja GNU Bazaar.
==Monotone==
Monotone on avoimen lähdekoodin hajautettu versionhallintajärjestelmä, joka asettaa suuremman painoarvon tiedon yhtenäisyydelle () ja luotettavuudelle kuin suorituskyvylle.
Monotone käyttää kryptografisia toimintoja sekä muutoshistorian seuraamiseen että käyttäjätoimintojen autentikoimiseen.
==Git==
Kun BitMover lakkautti kaupallisen BitKeeper-järjestelmänsä ilmaisversion keväällä 2005, Linus Torvalds koodasi Linux-ytimen kehittämistä varten oman vapaan hajautetun versionhallintajärjestelmänsä Gitin. Subversionia Torvalds ei kokenut sopivaksi kernelin kehitystarkoituksiin.
BitKeeperin ohella Monotonesta inspiraatiota saanut Git lähtee liikkeelle ajatuksesta, että sen on oltava mahdollisimman nopea ja tuettava hajautettua ohjelmistonkehitystä, jolloin jokaista versiota voi kehittää ja testata itsenäisesti. Tällöin testausta varten ei tarvitse kasata yhtä suurta pakettia, joka sisältää kaikki muutokset. Keskuspalvelinta ei tarvitse kuin muutoksista tiedottamiseen.
Koska Gitissä muutosten kirjaaminen eli commit ja versioiden tekeminen on salamannopeaa, voi työtä hajauttaa helposti pieniin paloihin ja eri kehittäjille. Git käsittelee muutoksia koodiin kokonaisuutena eikä yksittäisten tiedostojen pohjalta. Muutoshistorian seuranta perustuu SHA-1 -algoritmiin.
Gitiä on alettu vuoteen 2009 mennessä hyödyntää Linuxin ohella lukuisissa korkean profiilin ohjelmistohankkeissa kuten: Perl, GNOME, Qt, Samba, Kannettava tietokone jokaiselle lapselle, VLC media player, FFmpeg, Wine, Ruby on Rails ja Googlen Android-käyttöjärjestelmä. Gitin ympärille on muodostunut vahva yhteisö, joka kehittää sitä aktiivisesti.
Ars Technican mukaan Microsoft käyttää nykyisin Gitiä Windowsin lähdekoodien hallintaan.
==Mercurial==
Mercurial on avoimen lähdekoodin hajautettu versionhallintajärjestelmä kuten Git ja Bazaar, jota mm. Facebook käyttää.
==GNU Bazaar==
GNU Bazaar on hajautettu versionhallintajärjestelmä kuten Git ja Mercurial. Bazaar on avoimen lähdekoodin projekti, jota sponsoroi Canonical.
==Darcs==
Darcs on avoimen lähdekoodin hajautettu versionhallintajärjestelmä, joka on tehty Haskell-kielellä.
==BitKeeper==
BitKeeper on BitLogic:n kaupallinen versiohallintajärjestelmä, joka soveltuu erityisen hyvin
suuriin, hajautettuihin projekteihin. BitKeeper toimii hajautetusti ja versioiden yhdistäminen on tehokkaampaa kuin CVS:ssä. Rational ClearCase on toinen suosittu
kaupallinen järjestelmä, joka tarjoaa ominaisuuksia versiohallinnan lisäksi myös
muuhun ohjelmistotuotteen hallintaan.
BitKeeperin kehityksen aloitti Larry McVoy ja sen omistaa BitMover-yhtiö. CVS:ään
verrattuna BitKeeper tarjoaa ominaisuuksia, jotka helpottavat versiohallintaa suurissa,
maantieteellisesti hajautetuissa projekteissa. BitKeeper on ollut käytössä
esimerkiksi Linuxin ytimen kehityksessä.
BitKeeper toimii hajautetusti siinä mielessä, että jokaisella kehittäjällä on omalla
koneellaan täydellinen kopio projektin varastosta. Tätä kopiota kutsutaan lapseksi
ja päävarastoa vanhemmaksi. Kun kopio on kerran tehty, kehittäjän koneen ja
päävaraston välillä siirretään vain tietoa tehdyistä muutoksista. Lapsivarastot
voivat vaihtaa muutostietoa myös keskenään. Tämä helpottaa työskentelyä kun verkkoyhteyttä ei ole käytettävissä, tai käytössä on hidas yhteys. Myöskään päävarastopalvelimen käyttökatkokset eivät haittaa työskentelyä siinä määrin kuin täysin
keskitetyssä järjestelmässä.
BitKeeper voi käyttää eri protokollia, kuten SSH:ta, RSH:ta, BKD:ta, HTTP:ta ja
SMTP:tä päivitysten tekemiseen.
Myös versioiden välisten muutosten käsittelyä on BitKeeperissä tehostettu. Kehittäjät
voivat koota samaan asiaan liittyvät muutokset niin sanotuksi muutosjoukoksi
(engl. changeset). Muutosjoukko tallennetaan tiedostoon, jossa kerrotaan, mitä on
muutettu ja mitä ei. Tämän avulla voidaan erottaa esimerkiksi yksittäisen virheen
korjaamiseksi tehdyt muutokset.
BitKeeper on kaupallinen, mutta aikaisemmin sitä on kuitenkin voinut käyttää
ilman maksullista lisenssiä, mikäli ei ole käyttänyt monen käyttäjän varastoa tai
on suostunut käyttämään OpenLogging-järjestelmää. OpenLogging on järjestelmä,
jossa lähetetään metatietoja projekteista keskitetylle web-palvelimelle, jonka avulla
muut kehittäjät voivat seurata toistensa edistymistä. Palvelu on julkinen, jonka
vuoksi kuka tahansa voi selata projektien tietoja. Järjestelmä ei sisällä lähdekoodia
vaan ainoastaan kehityslokeja sekä kehittäjäkohtaista statistiikkaa.
Pääasiallisesti BitKeeper on kuitenkin suunnattu maksullisen lisenssin omaaville,
joka korostui kun BitMover ilmoitti 5. huhtikuuta 2005 lopettavansa ilmaisen version
tarjoamisen BitKeeperistä.
==ClearCase==
ClearCase on IBM Rationalin kaupallinen versiohallintajärjestelmä, jonka alkuperäinen kehittäjä Rational Software on nykyisin IBM:n omistuksessa. ClearCase on osa IBM:n tarjoamaa kokonaista tuoteperhettä ohjelmistotuotteen hallinnan eri osa-alueisiin. Varsinaisen versiohallinnan lisäksi ClearCase tarjoaa toimintoja myös työtilan, ohjelmistokoontien ja muutosten hallintaan. Järjestelmä on integroitavissa moniin ohjelmistonkehitysympäristöihin kuten Eclipseen, Visual Studioon, ja WebSphereenhttp://www-306.ibm.com/software/awdtools/clearcase/features/index.html?S_CMP=wspace.
Kaupallisen järjestelmän sisäisestä toiminnasta on vaikea saada tietoa, mutta ClearCase mahdollistaa ainakin historiallisen ja loogisen versioinnin. Työskentely ClearCasella tapahtuu checkin/checkout -mallin mukaan, joka vastaa CVS:n toimintatapaa.
ClearCase käyttää versioiden tallentamiseen oliotietokantaa, joka mahdollistaa tarkan pääsynvalvonnan. Järjestelmällä voidaan hallita teksti- ja binääritiedostoja, testauskomentojonoja, hakemistoja ja yleisesti ottaen kaikkia tiedostojärjestelmän kohteita.
ClearCase on saatavissa seuraaville käyttöjärjestelmille: AIX, HP-UX, Linux, muut Unix-kaltaiset alustat, Solaris ja Windows.http://www-306.ibm.com/software/awdtools/clearcase/ Se integroituu natiivina myös saman tuoteperheen ClearQuest-virheenseurantajärjestelmään.
==Endevor==
Endevor on CA Technologiesin versiohallintajärjestelmä IBM z/OS suurtietokoneille.
==Perforce Helix==
Perforce Helix (ennen vain Perforce) on Perforce Softwaren kaupallinen versionhallintajärjestelmä.
==PVCS==
PVCS Version Manager (ent. Polytron Version Control System) on Serena Softwaren kaupallinen versionhallintajärjestelmä. Versio 8.5 on saatavilla muun muassa AIX, Linux, Solaris ja Windows alustoille.
==QVCS==
QVCS (Quma Version Control System) on alun perin Amiga-tietokoneelle julkaistu kaupallinen versionhallintajärjestelmä, jonka on julkaissut Quma Software. Alkuperäinen versio on siirretty Windows-alustalle vuonna 1996, se on myöhemmin toteutettu uudelleen Java:lla ja julkaistu avoimena lähdekoodin versiona.
==Visual Source Safe==
Visual Source Safe on Microsoftin versiohallintajärjestelmä, joka seuraa Microsoftin Visual Studio -kehitysympäristön mukana.
Visual Source Safe (VSS) on erityisesti Windows-alustalle tarkoitettu asiakas-palvelin -tyylinen versiohallintaohjelmisto.
Source Safen etuna on helppo käyttöönotto, jos sovelluskehitystä tehdään Visual Studio -työkaluilla Microsoft-ympäristössä. VSS integroituu vakiona Visual Studioon.
Laajempiin ja hajautetumpiin projekteihin Microsoft suosittelee Visual Studio Team Systemin Visual Studio Team Foundation Server -palvelinta.
Microsoft tukee Visual Source Safen käyttämistä vain Windows-asiakasohjelmien kanssa, mutta kolmansilta osapuolilta on tarjolla myös asiakasohjelmat Javalle, Linuxille, Macintoshille ja Sunin Solaris-käyttöjärjestelmälle.
Source Safe on kerännyt laajalti negatiivista huomiota sen ongelmakohtiin.
==Lähteet==
==Aiheesta muualla==
* Subversion
* Concurrent Versions System
* Git
* Mercurial
* Bazaar
* Monotone
* Darcs
* BitMover BitKeeper
* Plastic SCM
* IBM Rational ClearCase
* Microsoft Visual Source Safe
* IBM Rational Synergy (ex Telelogic Synergy)
* Dimensions CM
* GNU arch
* Revision Control System
* Perforce
Luokka:Versionhallinta
Luokka:Versionhallintajärjestelmät