Versionshantering Problem som uppstår i större (samt även mindre) projekt: Samtidiga ändringar. Kålle och Ada öppnar samma fil för redigering vid var sin dator. Om Kålle först sparar sina ändringar och Ada därefter sparar sina, så går Kålles ändringar förlorade. Misslyckade utvecklingssteg. Kålle börjar arbeta på en större omskrivning av av projektet, men inser efter en vecka att han är på fel spår och vill då gå tillbaka till läget innan han började ändra. Support av gamla versioner. Fixa buggar i version 1.X efter att 2.X börjat utvecklas. Hitta regressioner. I vilket sammanhang introducerades viss kod. 1
Tillåt bara en användare I taget. Samtidiga ändringar Kan ge tidsförluster om någon behöver vänta. Tillåt flera samtidiga användare, men varna vid skrivning. Mycket manuellt arbete om man ofta arbetar i samma filer. Tillåt flera användare. Kombinera flera olika användares resultat automatiskt vid skrivning. Om det uppkommer konflikter, tydliggör dessa och varna användaren. Problem med binärfiler, men bra lösning för källkod och andra textfiler. 2
Misslyckade utvecklingssteg Spara backupkopior av alla filer i lämplig katalog tillräckligt ofta. Lätt att glömma, bara senaste backup tillgänglig. Lita på att driftavdelningen gör backup på filsystemet och be systemadministratören återställa läget för en vecka sedan. Hur ofta görs backuperna? Lagra alla filers alla versioner i en databas, där man kan återvinna vilken version som helst. Gör det också lättare att ge support för gamla versioner. 2.0 2.3 1.0 1.8 3
Grundläggande egenskaper Kan lagra projekt bestående av flera versioner av träd av kataloger och filer i en central lagringsplats (eng. repository). Användare arbetar med separata lokala kopior av projektet. Användare kan när som helst spara sin lokala kopia till den centrala lagringsplatsen, där den utgör en ny version (eng commit/revision). Användaren kan när som helst återgå till en tidigare version. 4
CVS (Concurrent Version System). CVS och SVN Mest av historiskt intresse, men lever fortfarande kvar i många projekt. SVN (Subversion). Nyare med lösningar på flera problem i CVS. Versionshantering av hela katalogstrukturer istället för separata filer, bättre stöd för att flytta filer. Mindre risk för att binärfiler förstörs. Lokal kopia av orginalfilerna, så man slipper ansluta till servern för vissa operationer. Fler alternativ nämns senare i presentationen. Observera, det är obligatoriskt att använda något versionshanteringssystem i den här kursen. SVN rekommenderas. 5
SVN 1: Skapa en lagringsplats Skapa en katalogstruktur som innehåller följande: / rooten trunk/ Katalogstruktur för den aktiva versionen - proj/ Erat projekt, kan ha annat namn. branches/ Förgreningar, här sker utveckling och underhåll av gamla versioner. - proj-1/ - proj-2/ tags/ Innehåller referenser för att lätt hitta släppta versioner. - proj-1.0/ - proj-1.1/ - proj-2.0/ Detaljerade instruktioner på kurshemsidan. 6
Placera dig i en lämplig katalog Kör följande kommando: SVN 2: Skapa lokal kopia svn checkout URL För student1, i grupp 01 är URL (förutsatt att man använt repo och proj som namn): svn+ssh://student1@remote1.studat.chalmers.se/chalmers/groups/tda366-09-01/repo/trunk/proj Ger en katalog med namnet proj. Den innehåller projektets katalogstruktur, samt en katalog som heter.svn med filer som subversion behöver. 7
svn add filnamn Gör att filnamn versionshanteras. SVN 3: Redigering svn commit -m Lade till funktion x Skickar upp en ny version till den centrala lagringsplatsen. svn update Laddar ner de senaste ändringarna från den centrala lagringsplatsen och kombinera med dina lokala ändringar. Kan ge konflikt, om du ändrat på samma ställe i en fil som någon annan. 8
svn status SVN 4: Hämta information Ger information om statusen för dina lokala kopior av filerna. T.ex. A (Added), M (Modified) eller C (Conflict). I det sistnämnda fallet behöver du lösa konflikten innan du kan fortsätta. Flaggan -u kan användas för att se centrala ändringar. svn log Ger information om alla versioner, med det meddelande som gavs vid commit. svn update --revision N Gå tillbaka till en gammal version. N kan vara versionsnummer eller datum som {2008-04-10} svn diff Se vilka ändringar du gjort 9
SVN 5: Konflikter Om man har konflikt i en fil så kommer svn att markera konflikten i filen, t.ex. MyClass.java. for (int k = 0; k < MAX; k++) <<<<<<<<.mine time[k] = 0; ======== time[k] = INFTY >>>>>>>>.r7 init = 0 Ovanför likhetsteknen finns din version, under finns någon annans. Du får nu bestämma vad som är rätt och efter att du tagit bort konfliktmarkerarna gör du: svn resolved MyClass.java 10
SVN 6: Lära sig mer Mer information om subversion finns på: http://svnbook.red-bean.com Finns plugin till eclipse, subclipse. http://subclipse.tigris.org/ Windows-användare kan använda TortoiseSVN. http://tortoisesvn.tigris.org/ 11
Allmänna råd Lägg bara upp källkod, bilder och liknande. Undvik att lägga upp classfiler och andra genererade filer. Använd svn rm och commit om felaktiga filer läggs till av misstag. Se till så att det kompilerar innan ni kör commit. Mycket irriterande för andra om update introducerar kompileringsfel. Gäller också att se till så alla nya filer läggs till. Undvik exotiska tecken (t.ex. å, ä och ö) i filnamn. Kan leda till problem på olika system. Se till så stora och små bokstäver är rätt i filnamnen innan de läggs upp. Att bara ändra mellan stora och små bokstäver i efterhand kan ge problem. 12
Distribuerad versionshantering Varje användare har en egen kopa av versionsdatabasen. Kan arbeta helt självständigt utan att ansluta till den centrala servern. commit sparar versioner lokalt. push/pull för att synkronisera med andra. Bättre stöd för icke-linjär utveckling. Olika personer kan arbeta på olika förgreningar (eng. Branches). Förgreningarna kan lätt kombineras (eng. merging). Ingen strikt hierarki Alla kan skicka/ta emot ändringar utan att behöva gå via den centrala servern. Gör att även personer som bara har läsrättigheter lätt kan göra större förändringar. 13
Git http://git-scm.com/ Olika alternativ Används för Linux-kärnan, X.Org, Google Android, VLC mfl Finns installerat på studat. Mercurial (Hg) http://www.selenic.com/mercurial/ Används bl.a. av Mozilla och Sun. Darcs http://darcs.net/ Används av diverse haskell-projekt. Finns via unsup. echo unsup >> $HOME/.vcs4/pathsetup Prata med er handledare om ni vill använda något annat än SVN. 14
Git 1: Skapa databas Gör följande för att skapa versionsdatabas mkdir proj1 cd proj1 git init Lägg till de första filerna (eventuellt bara.gitignore) git add. git commit -m Initial commit cd /chalmers/groups/tda366-09-01/ mkdir proj1.git cd proj1.git git --bare init --shared git --bare fetch ~/proj1 master:master chgrp -R tda366-09-01. 15
Git 2: Ladda ner lokal kopia Varje person behöver göra följande: git clone REPO där REPO t.ex. är - student1@remote1.studat.chalmers.se:/chalmers/groups/tda366-09-01/proj1.git cd proj1 git config user.name 'Ditt namn' git config user.email 'din@adress.se' 16
Git 3: Redigera git add fil.java Spara senaste ändringarna från fil.java i index. git commit -m Fixade bug Spara indexet som en ny version. git fetch origin Hämta senaste ändringarna från er centrala databas origin är den databas du klonade, andra går att lägga till med git remote git merge origin/master Kombinera dina lokala ändringar med andras master är standardförgreningen fetch+merge kan kombineras med: git pull origin master git push origin master Skicka upp dina ändringar till den centrala databasen 17
Git 4: Förgreningar git branch namn Skapar en ny förgrening med namnet namn git checkout namn Flytta över till förgreningen namn Används också för att hämta objekt från databasen Större ändringar är lämpligt att göra på ny förgrening: git branch temp git checkout temp Repetera: redigera, testa, add, commit git checkout master git merge temp git push origin master Kan byta över till master eller annan förgrening för ändringar som inte är relaterade till temp 18
git gui och gitk git svn Git 5: Mer information Grafiska program för att göra mycket av jobbet. Låter dig använda git lokalt men arbeta mot en central SVN databas. Git för windows msysgit http://code.google.com/p/msysgit/ TurtoiseSVN-liknande interface under utveckling: http://code.google.com/p/tortoisegit/ Eclipse plugin http://repo.or.cz/w/egit.git Kräver att ni kompilerar själva. 19