Versionhallinta MIKSI?
Versionhallinta Miten jakaa tiedostot ihmisten kesken? Miten pitää tiedostot ajan tasalla? Miten hoitaa päällekkäiset muutokset samaan tiedostoon? Miten muistaa, mitä on tehty? Miten peruuttaa takaisin kännissä tehdyt muutokset? Miten varmuuskopioida tiedot? Miten ylläpitää useita versioita ohjelmasta?
Subversion Tiedostojen versionhallintaan (kuten RCS) Tarkoitettu usean hengen projekteihin Toimii verkon yli yhteiseen tietovarastoon Hyötyjä Historian säilyttäminen (peruutusmahdollisuus) Toimii samalla varmuuskopiona Tiedostojen jakaminen ja synkronointi Unix/Linux: svn:n saa valmiina pakettina Windows: http://tortoisesvn.tigris.org/ Mac OS X: http://subversion.tigris.org/
Erilaisia versionhallintoja RCS Yksittäisten tiedostojen paikalliseen versiointiin CVS Kokonaisen projektin paikalliseen versiointiin Subversion Projektin keskitettyyn versiointiin verkossa Git (Bazaar, Mercurial) Projektin hajautettuun versiointiin
Subversion Eroja RCS:ään Toimii paremmin usean ihmisen projekteissa Hallitsee koko projektia, ei vain yksittäisiä tiedostoja Toimii myös binaaritiedostoille (pdf, doc, odt, gif, jpg...) Toimii myös hakemistoille, ei vain tiedostoille Toiminta verkon yli (ssh, https,...) Koko projektilla yhteinen versionumero (RCS:ssä joka tiedostolla oma)
Termejä Tietovarasto (repository) taltioi kaiken tiedon (verkon yli) Työkopio (working copy) on käyttäjän "työhakemisto" (kopiot tiedostoista) Revisio (revision) on numeroitu "valokuva" projektista tietyllä hetkellä
Svn:n toiminta commit kurssisvn.cs.tut.fi Tietovarasto ryhmal commit omakone1 update update omakone2 Työkopio (hakemisto) Työkopio (hakemisto)
Svn:n peruskomentoja Työkopion haku (svn checkout) Tiedostojen lisäys (svn add) Tilanteen kysely (svn status) Muutosten kysely (svn diff) Muutosten talletus (svn commit) Työkopion päivitys (svn update)
Svn:n lisäkomentoja Tiedoston poisto (svn rm/del) Hakemiston lisäys (svn mkdir) Tiedoston+historia siirto (svn mv/move/rename) Tiedoston+historia kopiointi (svn cp/copy) Muutosten yhdistely (svn merge) Konfliktien korjaus (svn resolved) Työhakemiston vaihto (svn switch)
Hakemistorakenne trunk/ "Työhaara", jossa varsinainen koodaus tehdään Yleensä riittää hakea checkout:lla vain tämä tags/ "Julkaisuja" varten, tällä kurssilla palautukset Ohjeet tulevat myöhemmin branches/ "Haaroja" varten, esim. väliaikaiset kokeilut, isommat muutokset, julkaisukandidaatit yms. arvostelu/ Boss:n ja assareiden arvostelut palautuksista (Ei osa svn:n normaalia hakemistorakennetta)
Ennen svn:n käyttöä Svn:lle pitää kertoa, että C++tiedostot ja Makefile ovat tekstiä (merkistömuutokset, $Id$ jne.) Unix/Linux editoitava tiedostoa ~/.subversion/config Windows & TortoiseSVN Oikea nappi - TortoiseSVN - Settings General - Subversion configuration file: - Edit
svn checkout Hakee työkopion tietovarastosta Tällä kurssilla: svn checkout https://kurssisvn.cs.tut.fi:8010/ryhma#/trunk nimi_hakemistolle Täytyy tehdä vain kerran alussa Tietovarastoissa oletuksena valmis perusrakenne esim. julkinen-hakemisto
svn add Lisää tiedoston svn:n hallintaan Tehtävä jokaiselle uudelle tiedostolle, jonka haluaa tallentaa: svn add tiedostonimi Komento vain rekisteröi lisäyksen, ei vielä talleta sitä (commit) Tiedostoa voi muokata rauhassa ennen ja jälkeen
svn commit Tallentaa tehdyt muutokset tietovarastoon Kysyy kommentin lokia varten Joko koko hakemistolle tai tiedostoille svn commit -m "Komentin voi laittaa tähänkin" svn commit tiedosto1 tiedosto2 Joka tallennuksesta oma revisio, joilla oma numeronsa (loki, kumoamiset...)
svn status Kertoo, missä tilassa tiedostot ovat A : (Added) tiedosto lisätty D : (Deleted) tiedosto poistettu M : (Modified) tiedostoa muutettu R : (Replaced) ensin tuhottu, sitten lisätty? : (?) tiedosto ei svn:n hallinnassa C : (Conflict) tiedosto konfliktitilassa (ristiriitaisia muutoksia) X : (external) tiedosto haettu muualta (julkinenhakemisto) Ei tarvitse verkkoyhteyttä, paitsi jos: svn status -u (tai --show-updates)
svn update Päivittää työkopion tietovarastosta Hakee muiden tekemät muutokset svn update Tulostus kuin svn status Jos muutoksia tietovarastossa + työkopiossa, tulostus: G : (merged) muutokset yhdistetty onnistuneesti C : (Conflict) muutokset ristiriitaisia, pitää korjata käsin
svn diff Kertoo mitä muutoksia tiedostoon on tehty, näyttää muuttuneet rivit svn diff tiedosto svn diff Mahdollista verrata vanhaan revisioon svn diff -rrevisio# tiedosto svn diff -rrev1:rev2 tiedosto Tietyn commitin muutokset: svn diff -crevisio#
svn revert Muutoksen peruminen, jos talletusta (commit) ei vielä tehty svn revert tiedosto Ei tarvitse verkkoyhteyttä Jos talletus (commit) on jo tehty, palautus onnistuu vielä svn cp -r:llä (tästä myöhemmin)
svn mv, rm, cp Tiedostoja myös mahdollista tuhota (rm/del), uudelleennimetä/siirtää (mv/rename), kopioida (cp/copy) Näissä operaatioissa tiedoston historia säilyy ja kopioituu mukana Käytä näitä normaalien cp:n, mv:n ja rm:n sijaan!
svn log Näyttää muutoskommentit tiedostosta tai hakemistosta svn log tiedosto Saa tulostamaan myös tiedostonimet: svn log -v tiedosto
Konfliktien korjaus Ristiriitaisia muutoksia svn update:n yhteydessä: konflikti Ristiriitaiset rivit merkitään tiedostoon merkein <<<<<, ===== ja >>>>> Tiedosto editoidaan käsin kuntoon, sitten svn resolve --accept working tiedosto (+commit) Tarvitaan yleensä varsin harvoin
Vanhojen muutosten kumoaminen Jos halutaan jokin vanha versio tiedostosta: Selvitetään halutun version numero Poistetaan nykyinen tiedosto: svn rm X.cc Kopioidaan vanha versio nykyiseen hakemistoon: svn cp -r## X.cc. Talletetaan muutos: svn commit -m ".." X.cc (Tämän jälkeen lokissa eivät enää näy "yli hypätyt" kumotut versiot)
Vanhojen muutosten kumoaminen Jos halutaan kumota vain jotkin muutokset, "upotetaan" vanhat muutokset käänteisjärjestyksessä Joko tiedostoon tai koko hakemistoon svn merge -c-muutos# tiedosto svn merge -ruusi#:vanha# Muutokset voi katsoa etukäteen svn diff -c-muutos# svn diff -ruusi#:vanha# tiedosto (svn merge osaa tehdä paljon muutakin)
Tagit (htyön palautus) Kopioidaan tietty revisio tags/xxxhakemistoksi Esim. harkkatyön palautukset tags/palautus1, tags/palautus2 Huom: muista ensin svn commit! svn cp https://.../trunk https://.../tags/palautus1
Haarat Kopioidaan hakemisto trunk paikkaan branches/xx, räpelletään, upotetaan muutokset takaisin trunk:iin Kätevä muutoksille, joiden ei haluta näkyvän kaikille Haaran voi hakea (checkout) omaan hakemistoonsa tai Työhakemiston voi vaihtaa haaraan (ja myöhemmin takaisin)
Haarat Työhakemiston vaihto haaraan ja takaisin: svn cp -m "Haaraudu" ^/trunk ^/branches/koe svn switch ^/branches/koe (vaihto haaraan)... tehdään muutoksia + commit svn switch ^/trunk (vaihto takaisin trunkiin) svn merge ^/branches/koe svn commit -m "..." (svn rm ^/branches/koe)
Haarat Haara omassa hakemistossaan (^ = tietovaraston juuri): svn cp -m "Haaraudu" ^/trunk ^/branches/koe cd jonnekin-muualle svn checkout ^/branches/koe hakemisto... tehdään muutoksia + commit cd takaisin-trunk-työhakemistoon svn merge ^/branches/koe svn commit -m "..." (svn rm ^/branches/koe) (rm -r haaran-hakemisto-hakemisto)
Haarat ja julkaisut Tyypillinen haarojen käyttö todellisessa projektissa: 1.Kopioidaan trunk haaraksi (release1) 2.Testataan ja viimeistellään haara 3.(Kehitys voi jatkua trunkissa) 4.Julkaistaan kopioimalla haara tagspuolelle (branches/release1 -> tags/version1.0) 5.Bugikorjataan haaraa tarvittaessa 6.Julkaistaan uusia versioita (version 1.1)