Too Cool for Internet Explorer

Subversion på DIKU


Subversion er et system til versionsstyring af projekter. Det er en af den slags værktøjer som tager lidt tid at gøre sig bekendt med, men som man på DIKU ikke kan undgå før eller siden. Mit råd er derfor naturligvis: Lær det .. heller nu end i morgen.

Mange har før givet gode introduktioner til subversion (også forkortet svn) så flg. er meget kortfattet; Versionsstyring kan benyttes til at dele projekter med andre samt lave backup. To ting som er uundværlige i stort set alle projekter. Svn gør det ved at man opretter et 'repository' på en eller anden server som alle har adgang til (gerne med ssh). Dernæst opretter man lokale svn-arbejdsmapper på sin egen computer/sine egne computere. Man redigerer i disse svn-arbejdsmapper og når man synes at man vil dele sit arbejde med andre (eller tage backup) beder man blot svn om at synkronisere ændringerne med det centrale repository.

Vejledning i opsætning af svn-repository og svn-arbejdsmappe på DIKU's system

Følgende skal kun gøres en gang når repo'et bliver sat op.

  • Få fat i noget diskplads. Normalt er almindelige konti på DIKUs system ikke specielt store så jeg kan anbefale at skrive til edb-afdelingen om at få x antal MB plads SAMT at få oprettet en gruppe med brugernavnene til de som ønsker at benytte repository'et. Typisk får man en projekt-mappe under /usr/local/projects/disk<nr>/<projektNavn> (hvor <nr> og <projektNavn> naturligvis kan variere).
  • Log nu ind på DIKU's systemer og opret en undermappe i projekt-mappen:

mkdir /usr/local/projects/disk<nr>/<projektNavn>/repo
  • Bed subversion om at oprette et repository i denne mappe:
svnadmin create --fs-type fsfs /usr/local/projects/disk<nr>/<projektNavn>/repo

Jeg er ikke sikker men jeg mener der er nogen der har oplevet problemer hvis man undlader at benytte fsfs filsystemet, så better safe than sorry.
  • Sørg for at den gruppe i har fået oprettet har skriverettigheder til repositoriet:
chmod -R g+w /usr/local/projects/disk<nr>/<projektNavn>/repo

  • Log af DIKU og opret en svn-arbejdsmappe på din egen computer - eksempelvis
mkdir ~/Documents/DikuRepo
cd ~/Documents/DikuRepo

  • Foretag et 'checkout' af repository'et så arbejdsmappen 'ved' at de hænger sammen:
svn checkout svn+ssh://<burgernavn>@brok.diku.dk/usr/local/projects/disk<nr>/<projektNavn>/repo .

Der bør nu stå noget i stil med: 'Checked out revision 0'. De sidste to punkter kan gentages af alle som er medlemmer af den oprettede gruppe.

Brug af svn-arbejdsmappe

Der kan nu oprettes mapper og filer i svn-arbejdsmappen helt som normalt, men man skal være klar over hvilke filer og mapper som eksisterer i repositoriet og hvilke der ikke gør. Det kan være forvirrende og læres bedst ved at prøve sig frem. Følgende kommandoer er typisk benyttet til at vedligeholde arbejdsmappen.

  • svn add - Benyttes til at tilføje en fil eller en mappe til repositoriet.
  • svn commit -m "<Meget kort besked>" - Benyttes til at 'uploade' ændringer (både add'ede filer og ændringer i filer/mapper man har foretaget) til repository'et. Den lille besked kan være nyttig hvis man senere skal genskabe en backup.
  • svn up - Benyttes til at hente alle de ændringer andre har 'committet'
  • svn rm <filnavn> - Benyttes til at fjerne en fil eller en mappe fra repositoriet.
  • svn mv <filnavn> <filnavn2> - Benyttes til at flytte filer eller mapper i repositoriet.
  • svn cp <filnavn> <filnavn2> - Benyttes til at kopiere filer i repositoriet. (Benyt svn cp -R til at kopiere mapper)
  • svn status - Se status. Hvilke filer er redigerede, tilføjede, ajour eller ukendte i forhold til repositoriet.

Brugen af disse kommandoer kan måske illustreres med et lille eksempel-script:

cd ~/Documents/DikuRepo
svn up                                         #Check om nogen har lavet ændringer
mkdir NewFolder
echo "Linie 1" >> NewFolder/fil
svn add NewFolder                              #NewFolder er nu kendt i repo men ikke uploadet
svn commit -m "Første commit til repository"
echo "Linie 2" >> NewFolder/fil
svn cp NewFolder/fil NewFolder/filKopi
svn rm NewFolder/fil
svn commit -m "Tilføjede linie, lavede en kopi og slettede originalen"
cd ../
rm -rf DikuRepo                                #Uh-oh
mkdir DikuRepo
cd DikuRepo
svn checkout svn+ssh://<burgernavn>@brok.diku.dk/usr/local/projects/disk<nr>/<projektNavn>/repo . 
#phew .. back to work

Ekstra feats

  • svn propedit svn:ignore . - Åbner en editor (emacs) hvor man kan skrive de filnaven der skal ignoreres af subversion i denne mappe. Wildcards * er tilladt. I emacs gemmes der ved at holde Ctrl nede og taste xs og der afsluttes ved at holde Ctrl og taste xc.
  • svn diff -r PREV:HEAD <filnavn> - Viser de sidst commit'ede ændringer til en fil. PREV og HEAD refererer henholdsvis til den foregående revision for filen og den nuværende. Man kan også skrive et revisionsnummer ind: svn diff -r 100:HEAD <filnavn> hvorved man får samtlige ændringer fra revision 100 til den nuværende.
  • Opret et ssh-nøglepar så det ikke er nødvendigt at indtaste adgangskoder hele tiden. Se her hvordan.
  • Hvis nogen kommer til at commit'e en ændring i en linie som du også har ændret i vil der opstå en konflikt næste gang der køres svn up (muligvis beder svn dig ovenikøbet om at køre en 'up' før en 'commit' hvis den kan se en konflikt). Du skal herefter manuelt udrede denne konflikt ved at åbne filen og kigge efter en lignende opstilling som du så selv udredder:
<<<<<<<<<< 
linie
----------
redigeret linie
>>>>>>>>>>

  • Flere tips? Smid en kommentar.
Simon Shine's billede

Hvordan finder man ud af...

Hvordan finder man ud af hvad ens burgernavn er? ^__^

Jokes aside, tak for din udførlige gennemgang af SVN på DIKUs systemer!

McShine

Rasmus's billede

Tilføjelse

Jeg har tilføjet en beskrivelse af en nyttig kommando mere (svn diff) under 'Feats' afsnittet.