ESA Week 4a: Unix ☞ Vandaag: versiebeheer (RCS, CVS, SVN) ☞ Donderdag: Compilatiebeheer, SSH en nog het een en ander
1/30
23 september 2004
Versiebeheer Een Version-Control System biedt ondersteuning bij de ontwikkeling van m.n. software. ☞ Bijhouden van een ge¨annoteerde (veranderingen, bugs) geschiedenis van het project is een complexe taak ☞ Bij meerdere editors: voorkom het overschrijven van elkaars werk ☞ Terugkeren naar een oudere versie ☞ Vertakkingen
2/30
23 september 2004
Versiebeheer Belangrijkste Unix versiebeheerprogramma’s: ➢ SCCS (Source Code Control System) Bell Labs, 1980. Proprietary. Introductie van belangrijkste concepten. Wordt nog maar weinig gebruikt. ➢ RCS (Revision Control System) Purdue University, begin jaren 80. Open source. Basis van CVS. ➢ CVS (Concurrent Version System) Begin jaren 90. Onderhouden door de FSF (Free Software Foundation) ➢ SVN (Subversion) Begin jaren 00. CollabNet.
3/30
23 september 2004
RCS: Check-In, Check-Out ☞ De versiefile van een document bevat extra administatieve informatie ☞ Als je de file wilt bekijken of aanpassen, maak je eerste een werkfile; dit heet check-out. Als je wijzigingen aan wilt brengen, zet je bij de check-out een lock op het document ☞ Je kunt aanpassingen aanbrengen aan een werkfile, en de aanpassing doorvoeren in de versiefile; dit heet check-in
4/30
23 september 2004
Check-In, Check-Out: voorbeeld file
file’ | | edit | file’’
ci file ----------------> file,v
[versie 1.1]
file,v
[versie 1.2]
co -l file <----------------
ci file ---------------->
co -r1.1 file file’ <---------------[oude versie] 5/30
23 september 2004
Check-In, Check-Out: commando’s ➢ ci Check-in: Stop de werkfile in de versiefile; maak de versiefile aan als er nog geen is. Het systeem vraagt om een beschrijving van de veranderingen. ➢ co Check-out: maak een nieuwe werkfile aan vanuit de versiefile (readonly) ➢ co -l Check-out met lock; schrijfpermissie ➢ co -rNR Check-out file met revisienummer NR
6/30
23 september 2004
Revisienummering ☞ De nummering begint met 1.1 ☞ Bij elke check-in wordt het tweede nummer opgehoogd ☞ Het eerste nummer kun je verhogen door de -r optie te gebruiken; bijvoorbeeld, met ci -r2 file wordt het nieuwe nummer 2.1
7/30
23 september 2004
Samenwerken ☞ Als gebruiker A met co -l de file gelockt heeft, heeft A schrijfpermissie op de werkfile ☞ Vervolgens kan gebruiker B ook een co -l op dezelfde file doen; B krijgt dan een waarschuwing dat de file gelockt is ☞ B kan besluiten om desondanks toch door te zetten; A krijgt dan een waarschuwingsbericht (per email)
8/30
23 september 2004
RCS Informatie ☞ Je kunt in een werkfile informatie over de revisie opnemen ☞ Deze informatie zit in de versiefile ☞ Om deze automatisch, bij de check-out, in de werkfile te krijgen, gebruik je keywords ☞ Bijvoorbeeld Id voor informatie over o.a. auteur, datum, versie ☞ Het keyword plaats je in het document tussen $$ ☞ Dus een voorkomen van $Revision$ wordt bij check-out bijvoorbeeld $Revision 1.4$ ☞ Andere keywords zijn o.a. Author, Log, Date, Locker 9/30
23 september 2004
Vertakkingen ☞ Stel je bent bij versie 2.5, maar je wilt een alternatieve ontwikkeling vanaf versie 1.8 beginnen ☞ Je maakt dan met co -l -r1.8 een werkfile van versie 1.8 ☞ Let op: een gewone check-in van deze werkfile zou versie 2.6 opleveren ☞ Gebruik ci -r1.8.1 om een nieuwe tak vanuit versie 1.8 te beginnen (met eerste nieuwe versie 1.8.1.1)
10/30
23 september 2004
Merge Het mergen van takken. Stel dat file een werkfile van revisie 1.8.1.3 is, dan geeft rcsmerge -r1.8 -r2.5 file de merge van de file met versie 2.5. Een check-in levert nu versie 2.6. De merge-operatie kijkt naar de verschillen tussen de twee versies, en plaatst zoveel mogelijk in de nieuwe file. Wanneer er een conflict is, dan wordt het conflict gedeelte aangegeven tussen <<<<<< en >>>>>>.
11/30
23 september 2004
CVS: Concurrent Version System ☞ Aanvankelijk een front-end voor RCS ☞ Nieuwste implementaties niet meer afhankelijk van RCS ☞ Gebruikt wel het RCS-formaat voor de representatie van de versiefile ☞ Biedt meer functionaliteit dan RCS, heeft complexere interface, en gebruikt meer geheugen. ☞ Hierdoor: RCS geschikt voor kleine projecten met weinig editors ☞ CVS kan grote projecten aan met veel ontwerpers op verschillende plaatsen (verbonden via Internet) ☞ Geen exclusieve locks 12/30
23 september 2004
De Repository ☞ CVS bewaart de versiefiles van een project in een CVS repository – een directory op een machine die voor alle deelnemers bereikbaar is (de CVS server ) ☞ Men werkt locaal of remote, via ssh. In beide gevallen wijst de omgevingsvariabele CVSROOT naar de repository ☞ De repository kan worden opgedeeld in modules – een groep van files en/of directories ☞ Om aan een module foo te werken maak je een werkdirectory met cvs checkout foo ☞ CVS maakt dan een subdirectory foo aan met de werkfiles van de foo module 13/30
23 september 2004
Voorbeeld checkout $ cvs checkout foo cvs checkout: Updating foo U U U U
foo/.cvsignore foo/file1 foo/file2 foo/file3
$ ls foo CVS
14/30
file1
file2
file3
23 september 2004
Commit en Update ☞ Nadat je wijzigingen heb aangebracht kun je een check-in doen met cvs commit ☞ Als je met meerdere mensen aan de module werkt is het goed om voor de check-in eerst een update te doen met cvs update ☞ Bij een update kijkt CVS of anderen veranderingen hebben gecommit sinds je je check-out deed ☞ Zo ja, dan wordt je werkfile gemerged met de laatste versie
15/30
23 september 2004
Voorbeeld update $ cvs update cvs update: Updating . U file1 U file2 RCS file:
/foo/file3,v retrieving revision 1.4 retrieving revision 1.5 Merging differences between 1.4 and 1.5 into file3 M file3 $ 16/30
23 september 2004
Commit ☞ Als je files na een update zijn gemerged met revisies van anderen test je de laatste versie ☞ Doe daarna opnieuw een update: $ cvs update cvs update: Updating . M file3 ☞ CVS zegt nu dat file3 de enige file is die je hebt aangepast. Anderen hebben de file niet gecommit sinds je vorige update ☞ Met cvs commit file3 doe je nu je check-in 17/30
23 september 2004
Log message Na je cvs commit commando opent CVS een editor ($CVSEDITOR) zodat je een beschrijving van je veranderingen kunt invoeren
18/30
23 september 2004
De CVSROOT module ☞ Initialisatie van je repository: cvs init in de beoogde repository directory CVSROOT ☞ Hierna bevat de CVSROOT directory de speciale CVSROOT module ☞ Deze module bevat configuratie-informatie voor de repository
19/30
23 september 2004
Een nieuwe module beginnen ☞ Wanneer je een nieuw project begint maak je een nieuwe module aan in je repository met cvs import ☞ Ga naar de directory die je wilt importeren ☞ Het commando is cvs import <module naam> ☞ Na dit commando vraagt CVS je informatie over het project in te voeren in een editor
20/30
23 september 2004
Import voorbeeld $ $ $ $ $
mkdir example touch example/file1 touch example/file2 cd example cvs import example example_project ver_0_0
Nu wordt een module example aangemaakt; de example directory in de repository bevat de versiefiles file1,v en file2,v
21/30
23 september 2004
Files toevoegen en verwijderen ☞ Een file (of directory) toevoegen aan een module: zet de file file in je werkdirectory; geef het commando cvs add file ☞ Een file file verwijderen uit de repository: verwijder de file eerst uit je werkdirectory; geef het commando cvs remove file. Directories kun je niet verwijderen. Deze wijzigingen worden doorgevoerd bij de volgende commit
22/30
23 september 2004
Wijzigingen bekijken ☞ Het commando cvs log file geeft een overzicht van de log-gegevens van file; je ziet o.a. wie welke veranderingen wanneer heeft aangebracht ☞ Met cvs diff -c -r 1.6 -r 1.7 file krijg je een lijst met de verschillen tussen versie 1.6 en versie 1.7
23/30
23 september 2004
Tagging ☞ Je kunt een huidige versie van je project MijnProject een symbolische naam vXYZ — een tag — geven zodat je er later naar kunt refereren ☞ Je kunt naar revisienummers van files refereren, maar in de huidige versie van je project heeft file1 nummer 2.6, file2 nummer 2.8, etc ☞ Het commando cvs tag vXYZ geef je in de werkdirectory van de module ☞ Terughalen: cvs checkout -rvXYZ MijnProject ☞ Er is altijd ´e´en centrale tak, de ’trunk’ ☞ De tag-naam voor de laatste revisie van de trunk is altijd HEAD
24/30
23 september 2004
Branching ☞ CVS denkt over vertakkingen in termen van tags ☞ Een vertakkings-tag refereert naar de vertakking ☞ Gebruik het commando cvs tag -b takNaam in de werkdirectory van de te vertakken module ☞ Gebruik cvs checkout -rtakNaam om een werkkopie van de tak te krijgen. Als je nu commit, wordt de nieuwe revisie aan de tak geplakt
25/30
23 september 2004
Merging ☞ Om nu de tak takNaam te mergen met HEAD gebruik je cvs update -j takNaam ☞ Dit levert de nieuwe versie van de trunk ☞ Je krijgt een waarschuwing rcsmerge:
warning:
conflicts during merge
als er conflicten optreden bij een bepaalde file file ☞ Als dat gebeurt bewaart CVS een kopie van de HEAD versie als .#file1.5 (als het versienummer 1.5 is) ☞ In file geeft CVS in de tekst aan waar conflicten zitten (tussen <<<<<< en >>>>>>) 26/30
23 september 2004
Subversion (SVN) ☞ Project summary “A compelling replacement for CVS” ☞ Biedt de functionaliteit van CVS en min of meer dezelfde interface ☞ Maar dan meer en beter geimplementeerd
27/30
23 september 2004
Verschillen met CVS ☞ Atomaire commit Wanneer je een groep files commit, wil je dat ofwel alle files succesvol gecommit worden, ofwel geen enkele. In CVS zijn partieele commits mogelijk ☞ Renaming In CVS is renaming alleen mogelijk door een file in je werkdirectory een nieuw naam te geven, deze file toe te voegen (add) en de oude file te verwijderen (remove). Op deze manier verlies je alle informatie over de file. SVN biedt een goede renaming operatie (move) ☞ Versioning directories Ook directories kunnen in SVN hernoemd en verplaatst worden ☞ Binary diffs Het diff mechanisme van CVS is ingesteld op tekstbestanden en bijzonder inefficient op binary files. SVN doet het beter 28/30
23 september 2004
Verschillen met CVS ☞ Revisie nummering is anders: in CVS worden de files individueel genummerd. In SVN wordt een hele module genummerd. CVS: revisie 2.6 van file verschilt van revisie 2.7; SVN: er hoeft geen verschil te zijn tussen file in revisie 31 en file in revisie 32.
29/30
23 september 2004
Subversion Commando’s ➢ co/checkout ➢ ci/commit ➢ up/update ➢ add, remove/rm ➢ cp/copy ➢ mv/move ➢ log ➢ diff
30/30
23 september 2004