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 Samtidiga ändringar ■ Tillåt bara en användare I taget. ■ Tillåt flera samtidiga användare, men varna vid skrivning. ■ Kan ge tidsförluster om någon behöver vänta. 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. ■ Lita på att driftavdelningen gör backup på filsystemet och be systemadministratören återställa läget för en vecka sedan. ■ Lätt att glömma, bara senaste backup tillgänglig. 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 1.0 2.3 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 och SVN ■ CVS (Concurrent Version System). ■ SVN (Subversion). Nyare med lösningar på flera problem i CVS. ■ Mest av historiskt intresse, men lever fortfarande kvar i många projekt. 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-1/ proj-2/ tags/ Innehåller referenser för att lätt hitta släppta versioner. - ■ Erat projekt, kan ha annat namn. branches/ Förgreningar, här sker utveckling och underhåll av gamla versioner. - ➔ proj/ proj-1.0/ proj-1.1/ proj-2.0/ Detaljerade instruktioner på kurshemsidan. 6 SVN 2: Skapa lokal kopia ■ ■ Placera dig i en lämplig katalog Kör följande kommando: ■ svn checkout URL För student1, i grupp 01 är URL (förutsatt att man använt repo och proj som namn): svn+ssh://[email protected]/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 3: Redigering ■ svn add filnamn ■ svn commit -m ”Lade till funktion x” ■ Gör att filnamn versionshanteras. 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 4: Hämta information ■ svn status ■ svn log ■ Ger information om alla versioner, med det meddelande som gavs vid commit. svn update --revision N ■ 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. 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. ■ 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. ■ Undvik att lägga upp classfiler och andra genererade filer. Använd svn rm och commit om felaktiga filer läggs till av misstag. 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. ■ Bättre stöd för icke-linjär utveckling. ■ 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. 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 Olika alternativ ■ Git http://git-scm.com/ ■ Mercurial (Hg) http://www.selenic.com/mercurial/ ■ Används för Linux-kärnan, X.Org, Google Android, VLC mfl Finns installerat på studat. 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 - [email protected]:/chalmers/groups/tda366-09-01/proj1.git cd proj1 git config user.name 'Ditt namn' git config user.email '[email protected]' 16 Git 3: Redigera ■ git add fil.java ■ git commit -m ”Fixade bug” ■ 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 ■ Spara indexet som en ny version. git fetch origin ■ Spara senaste ändringarna från fil.java i index. 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 databasen17 Git 4: Förgreningar ■ git branch 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: ■ Skapar en ny förgrening med namnet namn 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 18 ändringar som inte är relaterade till temp Git 5: Mer information ■ git gui och gitk ■ git svn ■ Låter dig använda git lokalt men arbeta mot en central SVN databas. Git för windows ■ Grafiska program för att göra mycket av jobbet. 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