Det å opprette et Subversiondepot er en utrolig enkel oppgave. svnadmin-verktøyet som følger med Subversion har en delkommando som gjør akkurat det. For å opprette et nytt depot, er det bare å kjøre:
$ svnadmin create /sti/til/depot
Dette oppretter et nytt depot i katalogen
/sti/til/depot.
Dette nye depotet starter livet ved revisjon 0, som er definert
til å bare innholde en rot på toppnivå (/) i
filsystemet.
Revisjon 0 har også en enkelt revisjonsegenskap satt
innledningsvis, svn:date, som er satt til
tidspunktet depotet ble opprettet.
I Subversion 1.2 blir et depot opprettet i FSFS-formatet som
standard (se “Datalagring i depotet”).
Formatet kan bli eksplisitt valgt med
--fs-type-valget:
$ svnadmin create --fs-type fsfs /sti/til/depot $ svnadmin create --fs-type bdb /sti/til/annet/depot
Opprett ikke et Berkeley DB-depot på en nettverksdisk – det kan ikke eksistere på et fjerntliggende filsystem som NFS, AFS eller Windows SMB. Berkeley DB krever at det underliggende filsystemet har implementert streng POSIX låsesemantikk, og enda viktigere, muligheten til å mappe filer direkte inn i prosesshukommelsen. Nesten ingen nettverksfilsystemer tilbyr disse mulighetene. Hvis du forsøker å bruke Berkeley DB på en nettverksdisk, er resultatene uforutsigelige – du kan se mystiske feilmeldinger med en gang, eller det kan gå månedsvis før du oppdager at depotet i all stillhet blir herpa.
Hvis du trenger flere datamaskiner for å aksessere depotet, lager du et FSFS-depot på nettverksdisken, ikke et Berkeley DB-depot. Eller enda bedre, sett opp en skikkelig serverprosess (som for eksempel Apache eller svnserve), legg depotet i et lokalt filsystem som serveren kan aksessere og gjør depotet tilgjengelig over et nettverk. Kapittel 6, Serverkonfigurasjon dekker denne prosessen i detalj.
Du har kanskje lagt merke til at stiargumentet til
svnadmin bare var en vanlig filsystemsti og
ikke en URL lik det svn-klienten bruker når den
refererer til depot.
Både svnadmin og svnlook
ansees som serverside-verktøy – de blir brukt på maskinen hvor
depotet ligger for å undersøke og modifisere aspekter ved depotet,
og er faktisk ikke i stand til å utføre oppgaver over nettverket.
En vanlig feil som blir gjort av nybakte Subversionbrukere er å gi
URLer (til og med av typene “local” og
file:) til disse to programmene.
Så, etter at du har kjørt svnadmin create-kommandoen, har du et skinnende nytt depot i sin egen katalog. La oss ta en kikk på hva som egentlig er laget i denne katalogen.
$ ls depot conf/ dav/ db/ format hooks/ locks/ README.txt
Med unntak av filene README.txt og
format, er depotkatalogen en samling av
underkataloger.
Som i andre områder av Subversion-designet er modularitet gitt
stor oppmerksomhet, og hierarkisk organisering er foretrukket
framfor rotete kaos.
Her er en rask beskrivelse av alle elementene som du ser i den nye
depotkatalogen:
En katalog som inneholder konfigurasjonsfiler for depotet.
En katalog der Apache og mod_dav_svn lagrer sine husholdningsdata.
Der alle dine versjonerte data ligger. Denne katalogen er enten et Berkeley DB-miljø (full av databasetabeller og andre ting) eller et FSFS-miljø som inneholder revisjonsfiler.
Ei fil som inneholder en enkelt heltallsverdi som spesifiserer versjonsnummeret til depotlayouten.
En katalog full av maler for påhakningsskript (Engelsk: hooks) og påhakningsskriptene selv, når du har installert noen.
En katalog for Subversions låsedata, brukt for å følge tilganger til depotet.
Ei fil som bare informerer sine lesere om at de ser på et Subversiondepot.
Generelt sett skal du ikke fikle med depotet “for hånd”. svnadmin-verktøyet skal være nok til alle nødvendige forandringer i depotet, eller du kan se på tredjeparts verktøy (som Berkeley DBs verktøysamling) for å finpusse relevante delseksjoner av depotet. Noen unntak gjelder imidlertid, og disse skal vi gå gjennom her.
Et påhakningsskript (på engelsk kalt hooks) er et program som blir utløst av en hendelse i depotet, som for eksempel opprettelsen av en ny revisjon eller modifiseringen av en uversjonert egenskap. Hver påhakning blir gitt nok informasjon til å fortelle hva denne hendelsen er, hvilke mål den opererer på, og brukernavnet til personen som satte i gang hendelsen. Avhengig av påhakningens utdata eller returstatus, kan påhakningsprogrammet fortsette hendelsen, stoppe den, eller utsette den på en eller annen måte.
hooks-katalogen er, som standard, fylt
med maler for diverse depotpåhakninger.
$ ls depot/hooks/ post-commit.tmpl post-unlock.tmpl pre-revprop-change.tmpl post-lock.tmpl pre-commit.tmpl pre-unlock.tmpl post-revprop-change.tmpl pre-lock.tmpl start-commit.tmpl
Det er en mal for hver påhakning som Subversiondepotet
implementerer, og ved å undersøke innholdet til disse
eksempelskriptene, kan du se hva som fører til at hvert av disse
skriptene begynner å kjøre og hvilke data som blir levert til
dette skriptet.
Det som også ligger i mange av disse malene er eksempler på
hvordan man kan bruke skriptet i sammenheng med andre programmer
som følger med Subversion for å utføre vanlige, nyttige
oppgaver.
For å faktisk installere en påhakning som virker, trenger du
bare å plassere et kjørbart program eller skript i
depot/hooks-katalogen som kan bli kjørt
basert på navnet (som for eksempel
start-commit eller
post-commit) til påhakningen.
På Unix-plattformer betyr dette å legge inn et skript eller
program (som kan være et shellskript, et
Pythonprogram, et kompilert C-program, eller hva som helst
annet) som heter akkurat det samme som påhakningen.
Selvfølgelig, malfilene er der for mer enn bare
informasjonsverdien – den letteste måten å installere en
påhakning på Unixplattformer er å bare kopiere den riktige
malfila til ei ny fil som mangler
.tmpl-etternavnet, finpusse på innholdet, og
forsikre deg om at skriptet er kjørbart.
Men Windows bruker filetternavn til å avgjøre hvorvidt et
program er kjørbart eller ikke, så da må du legge inn et program
der hovednavnet er navnet på påhakningen, og der etternavnet er
en av de spesielle etternavnene som Windows kjenner igjen som
kjørbare, for eksempel .exe eller
.com for programmer, og
.bat for batchfiler.
Av sikkerhetsgrunner kjører Subversion påhakningsskript
med et tomt miljø (environment) – det betyr, ingen
miljøvariabler er satt i det hele tatt, ikke engang
$PATH eller %PATH%.
På grunn av dette blir mange adminstratorer forvirret når
påhakningsskriptet kjører fint for hånd, men virker ikke når
det blir kjørt av Subversion.
Pass på å eksplisitt sette variabler i skriptet og/eller bruk
absolutte stier til programmer.
Det er lagt inn ni påhakninger i Subversiondepotet:
start-commitDenne blir kjørt allerede før innleggingstransaksjonen er opprettet. Det blir vanligvis brukt til å avgjøre om brukeren har innleggingsprivilegier i det hele tatt. Depotet leverer to argumenter til dette programmet: Stien til depotet, og brukernavnet som forsøker seg på innleggingen. Hvis programmet returnerer en verdi som ikke er null, blir denne innleggingen stoppet allerede før transaksjonen blir laget. Hvis påhakningen skriver data til standardfeil, vil det bli sendt tilbake til klienten.
pre-commitDette blir kjørt når transaksjonen er komplett, men før den er lagt inn. Vanligvis blir denne påhakningen brukt til å beskytte mot innlegginger som er forbudt på grunn av innhold eller beliggenhet (for eksempel kan serveren kreve at alle innlegginger til en spesiell gren inneholder et billettnummer fra feildatabasen, eller at den innkommende loggmeldingen ikke er tom). Depotet leverer to argumenter til dette programmet: Stien til depotet, og navnet på transaksjonen som legges inn. Hvis programmet returnerer en verdi som ikke er null, avbrytes innleggingen og transaksjonen blir fjernet. Hvis programmet skriver data til stderr, vil dette bli sendt tilbake til klienten.
Subversiondistribusjonen inneholder noen
aksesskontrollskript (i
tools/hook-scripts-katalogen i
kildekodefiltreet til Subversion) som kan bli kalt fra
pre-commit for å kunne legge inn
finjustert kontroll for skriveaksess.
En annen mulighet er å bruke Apache-modulen
mod_authz_svn som gir både lese- og
skrivekontroll i individuelle kataloger (se “Adgangskontroll på katalognivå”).
I en framtidig versjon av Subversion planlegger vi å legge
inn lister for aksesskontroll (ACL) direkte inn i
filsystemet.
post-commitDette blir kjørt etter at transaksjonen er lagt inn, og en ny revisjon er opprettet. De fleste vil bruke denne påhakningen til å sende ut beskrivende eposter om innleggingen eller for å ta backup av depotet. Depotet gir to argumenter til dette programmet: Stien til depotet, og det nye revisjonsnummeret som ble opprettet. Returverdien fra programmet blir ignorert.
Subversiondistribusjonen inneholder skriptene
mailer.py og
commit-email.pl (i
tools/hook-scripts/-katalogen i
Subversiontreet) som kan bli brukt til å sende epost med
(og/eller legge til en loggfil) en beskrivelse av en
mottatt innlegging.
Denne mailen inneholder en liste over de stiene som ble
forandret, loggmeldingen som er vedlagt innleggingen,
forfatteren og datoen til innleggingen, sammen med en GNU
diff-visning av forandringene som ble gjort til diverse
filer som del av innleggingen.
Et annet nyttig verktøy som følger med Subversion er
skriptet hot-backup.py (i
tools/backup/-katalogen i
kildekodetreet til Subversion).
Dette skriptet tar “varme” backuper av
Subversiondepotet (en funksjonalitet støttet av den
bakenforliggende Berkeley DB-databasen), og kan bli brukt
til å foreta en øyeblikkslagring av depotet mellom hver
innlegging for arkiverings- eller sikkerhetsformål.
pre-revprop-changeFordi Subversions revisjonsegenskaper ikke er
versjonerte, vil det å forandre slike egenskaper (for
eksempel svn:log-egenskapen som
inneholder loggmeldingen for innleggingen) overskrive den
forrige verdien for alltid.
Siden data kan gå tapt her, har Subversion denne
påhakningen (og dens motstykke
post-revprop-change) så
depotadministratorer kan lage logger med forandringer i
disse elementene ved bruk av eksterne hjelpemidler hvis de
vil det.
Som en forholdsregel mot å miste uversjonerte data, vil
ikke Subversionklienter få lov til å forandre
revisjonsegenskaper i det hele tatt hvis ikke denne
påhakningen er aktivisert i depotet ditt.
Denne påhakningen kjører like før en slik modifisering blir lagt inn i depotet. Depotet leverer fire argumenter til denne påhakningen: Stien til depotet, revisjonen som egenskapen som skal forandres befinner seg på, det autentiserte brukernavnet til personen som gjør forandringen, og navnet på selve egenskapen.
post-revprop-changeSom nevnt tidligere, er denne påhakningen motstykket
til pre-revprop-change-påhakningen.
For paranoiaens skyld vil faktisk ikke dette skriptet
kjøre uten at
pre-revprop-change-skriptet finnes.
Når begge disse skriptene finnes, kjører
post-revprop-change-påhakningen like
etter at en revisjonsegenskap er blitt forandret, og blir
vanligvis brukt til å sende en epost som inneholder den
nye verdien til den forandrede egenskapen.
Depotet leverer fire argumenter til denne påhakningen:
Stien til depotet, revisjonen som egenskapen tilhører, det
godkjente brukernavnet til personen som gjør forandringen,
og navnet på selve egenskapen.
Subversiondistribusjonen inkluderer skriptet
propchange-email.pl (i
tools/hook-scripts/-katalogen i
Subversions kildekodetre) som kan bli brukt til å sende
epost med (og/eller legge til en loggfil) detaljene om en
egenskapsforandring.
Denne eposten inneholder revisjonen og navnet til den
forandrede egenskapen, brukeren som gjorde forandringen,
og den nye verdien til egenskapen.
pre-lockDenne påhakningen kjøres hver gang noen prøver å låse ei fil. Den kan bli brukt til å forby låser i det hele tatt, eller å definere et mer komplekst regelsett som spesifiserer nøyaktig hvilke brukere som får lov til å låse spesielle stier. Hvis påhakningen finner en allerede eksisterende lås, kan den også bestemme om en bruker har lov til å “stjele” den eksisterende låsen. Depotet leverer tre argumenter til påhakningen: Stien til depotet, stien som blir låst, og navnet på brukeren som prøver å utføre låsingen. Hvis programmet returnerer en verdi som ikke er null, blir låseprosessen avbrutt og alt som blir skrevet til standard feil blir sendt tilbake til klienten.
post-lockDenne påhakningen kjører etter at en sti er låst. Den låste stien sendes til påhakningens standard inn, og påhakningen mottar også to argumenter: Stien til depotet og brukeren som utførte låsingen. Skriptet kan dermed sende melding via epost eller logge hendelsen på den måten som er bestemt. Fordi låsingen allerede har skjedd, blir utdataene fra påhakningen ignorert.
pre-unlockDenne påhakningen kjøres når noen prøver å fjerne en lås på ei fil. Den kan brukes til å lage regler som spesifiserer hvilke brukere som har lov til å låse opp spesielle stier. Den er spesielt viktig for å avgjøre regler om bryting av låser. Hvis bruker A låser ei fil, får bruker B lov til å bryte låsen? Hva hvis låsen er mer enn en uke gammel? Denne typen ting kan bli bestemt og gjennomført av påhakningen. Depotet leverer tre argumenter til påhakningen: Stien til depotet, stien som låses opp, og navnet på brukeren som prøver å fjerne låsen. Hvis programmet returnerer en verdi som ikke er null, blir opplåsingsprosessen avbrutt og alt som blir skrevet til standardfeil leveres til klienten.
post-unlockDenne påhakningen kjøres etter at en sti er låst opp. Stien som er låst opp sendes til skriptets standard inn, og det mottar også to argumenter: Stien til depotet og brukeren som fjernet låsen. Påhakningen kan dermed sende epost eller logge hendelsen på den måten som er valgt. Fordi fjerningen av låsen allerede har skjedd, blir utdataene fra påhakningen ignorert.
Ikke forsøk å forandre transaksjonen ved å bruke
påhakningsskript.
Et vanlig eksempel på dette ville være å automatisk sette
egenskaper som svn:eol-style eller
svn:mime-type under innleggingen.
Selv om dette kan se ut som en god idé, fører det til
problemer.
Hovedproblemet er at klienten ikke vet om forandringen gjort
av påhakningsscriptet, og det er ingen måte å informere
klienten om at den er utdatert.
Denne inkonsekventheten kan føre til overraskende og uventet
oppførsel.
Istedenfor å forsøke å modifisere transaksjonen, er det
mye bedre å sjekke transaksjonen i
pre-commit og nekte innlegging hvis den
ikke møter de ønskede kravene.
Subversion vil forsøke å kjøre påhakningsskriptene som den samme brukeren som eier prosessen som aksesserer Subversiondepotet. I de fleste tilfeller blir depotet aksessert via Apache HTTP-serveren og mod_dav_svn, så denne brukeren er den samme som Apache kjører som. Selve påhakningene må bli satt opp med rettigheter på operativsystemnivå som tillater denne brukeren å kjøre dem. Dette betyr også at enhver fil eller program (inkludert selve Subversiondepotet) aksessert direkte eller indirekte av påhakningen vil bli aksessert som den samme brukeren. Med andre ord, vær obs på mulig rettighetsproblematikk som kan forhindre påhakningsskriptet fra å utføre de oppgavene du har satt det til.
Et Berkeley DB-miljø er en innkapsling av en eller flere databaser, loggfiler, regionfiler og konfigurasjonsfiler. Berkeley DB-miljøet har sitt eget sett med konfigurasjonsverdier for ting som antallet databaselåser som er tillatt brukt på en gang, maksimal størrelse på journalloggfiler og så videre. Subversions filsystemkode velger i tillegg standardverdier for noen av konfigurasjonsvalgene i Berkeley DB.
Folkene i Sleepycat (produsentene av Berkeley DB) innser at
forskjellige databaser har forskjellige krav, og de har derfor
lagt inn en mekanisme for å overstyre mange av
konfigurasjonsverdiene til Berkeley DB under kjøring.
Berkeley sjekker at fila DB_CONFIG finnes i
hver miljøkatalog, og leser valgene som er i denne fila for bruk
med akkurat dette Berkeley-miljøet.
Berkeley-konfigurasjonsfila for ditt depot ligger i
miljøkatalogen db i
depot/db/DB_CONFIG.
Subversion oppretter selv denne fila når den lager resten av
depotet.
Fila inneholder innledningsvis noen standardvalg sammen med
pekere til dokumentasjonen til Berkeley DB som ligger på nettet
så du kan lese om hva disse valgene gjør.
Du har selvfølgelig også muligheten til å legge til alle valg
som Berkeley DB støtter til DB_CONFIG-fila.
Pass bare på at mens Subversion aldri prøver å lese eller forstå
innholdet i fila og bruker ingen av valgene i den, vil du unngå
å gjøre forandringer i konfigurasjonen som får Berkeley DB seg
til å oppføre seg annerledes enn det Subversionkoden forventer.
I tillegg vil ikke forandringer gjort i
DB_CONFIG aktiviseres før du gjenoppretter
databasemiljøet (ved bruk av svnadmin
recover).