@@ Personlig information & webbloggerier

Föregående | Startsidan | Arkivet | Epost | Följande

torsdag 9 februari, 2006 11.07: Flytta ett delprojekt till eget repository i Subversion

I höstas satte jag upp en Subversion server för tryckeriet som jag sedan dess har använt föratt hålla ordning på våra olika webbeställningssystem och visitkortslayouter etc. Sedan dess har jag nöjt mig med ett repository, kallat "websystem", där jag har stoppat in varje enskilt projekt som en undermapp.

Problem 1: Detta har nu börjat visa sig vara lite småjobbigt i svnX som visar loggen för hela repositoryt i en enda stor lista i stället för ett enstaka projekt. (Kommandoradsklienten svn kan däremot visa log för specifika undermappar i repositoryt, men jag gillar att jobba med ett GUI.)

Lösning 1: Därför beslutade jag mig nyligen för att skilja ut varje projekt till egna repositories. Ett enkelt sätt att göra detta vore att exportera ett projekt, skapa ett nytt repository för det för att slutligen importera filerna i det nya repositoryt. Enkelt, eller hur?

Problem 2: Tyvärr har detta förfaringssätt en liten nackdel: all redigeringshistorik kommer att försvinna, alla fina kommentarer, den föregående stabila versionen, informationen om när kundens juridiska avdelningen ville spärra vissa titlar, när marknadsavdelningen sedan ville ha tillbaka titlarna igen, etc. Det nya repositoryt kommer bara innehålla en enda revision, själva importen av filerna. Hmm…

Lösning 2: Som tur är har andra råkat ut för detta problem tidigare, det finns till och med en hel del om detta i den officiella(?) Subversion-boken. Kortfattat går det ut på att dumpa källrepositoryt med svnadmin dump, skilja ut en specifik undermapp med svndumpfilter för att sedan importera resultatet till det nya repositoryt med svnadmin load.

Problem 3: Eftersom jag av någon anledning, hrm, var lite slö när jag lade till projektet som jag vill börja med så fick det inga branches, tags eller trunk-mappar, utan ligger direkt under repository-roten som "Generelltbestsystem". (Alla de andra projekten har den "korrekta" strukturen, men naturligtvis inte det som jag vill börja med - hur typiskt är inte det?)

Så, filstrukturen för projektet i det första repositoryt ser ut så här:

men jag vill att det skall se ut så här:

Lösning 3: Man kan för hand redigera en dumpfil, specifikt i detta fall; resultatet från svndumpfilter. En dumpfil är i mycket en textfil, eller rättare, de olika kommandon som används för att bygga upp ett repository är i textformat. Exempel på hur början av dumpfilen kan se ut:
SVN-fs-dump-format-version: 2

UUID: a74bc300-a700-0410-adf2-c1cd386f8f94

Revision-number: 0
Prop-content-length: 56
Content-length: 56

K 8
svn:date
V 27
2005-09-13T13:12:59.181920Z
PROPS-END

Revision-number: 1
Prop-content-length: 147
Content-length: 147

K 7
svn:log
V 46
Import av det generella beställningssystemet
K 10
svn:author
V 6
pihlan
K 8
svn:date
V 27
2005-10-24T09:03:56.486217Z
PROPS-END

Node-path: Generelltbestsystem
Node-action: add
Node-kind: dir
Prop-content-length: 10
Content-length: 10

PROPS-END


Det som är av intresse här är de egenskaper som bygger upp filstrukturen. Det finns två sådana egenskaper: Node-path, som anger var nya filer eller mappar skall skapas,och Node-copyfrom-path, som anger varifrån en fil eller mapp har flyttats i de fallen flytt eller kopiering i filstrukturen har skett (till exempel med svn move). Att fixa till mappstrukturen visar sig vara så enkelt som att söka efter alla instanser av Node-path: Generelltbestsystem och Node-copyfrom-path: Generelltbestsystem för att byta ut dessa mot Node-path: trunk/www respektive Node-copyfrom-path: trunk/www

Nog tjôta, dags för lite verkstad. Alla kommandon nedan kör jag på servern, i det konto jag satt upp som admin för Subversion:

1) Skapa en dumpfil "repos-dumpfile" av det gamla repositoryt (kallat "websystem"):
svnadmin dump svn-repositories/websystem/ > repos-dumpfile

2) Filtrera ut undermappen "Generelltbestsystem" ur dumpfilen "repos-dumpfile" och lägg det i den nya dumpfilen "genbest-dumpfile":
cat repos-dumpfile | svndumpfilter --drop-empty-revs --renumber-revs include Generelltbestsystem > genbest-dumpfile
Flaggan --drop-empty-revs ser till att bara de revisioner som har att göra med "Generelltbestsystem" kommer med, annars kommer det att skapas en massa revisioner i det nya repositoryt som är tomma. Flaggan --renumber-revs ser dessutom till att de revisioner som blir kvar numreras om från början i steg om 1, för att det inte skall bli stora hopp i revisionsnumreringen. Varning: om man externt använder sig av referenser till revisionshistoriken, t.ex. i bugglistan, i manualer eller korrespondens med kunder, så bör man inte använda sig av --renumber-revs, då dessa referenser inte längre kommer att peka på rätt revision! I mitt fall använder jag mig av Subversion mer på egen hand så detta skapar inget problem för mig.

3) Ändra alla angivelser av filstrukturen så att det som tidigare var i "Generelltbestsystem"i stället hamnar i "trunk/www":
sed -e 's#^Node-path: Generelltbestsystem#Node-path: trunk/www#g' -e 's#^Node-copyfrom-path: Generelltbestsystem#Node-copyfrom-path: trunk/www#g' -i .orig genbest-dumpfile

4) Att ändra på filstrukturen som jag gjorde i det föregående steget kan ställa till med problem, svnadmin load genomför nämligen bara exakt det som står i dumpfilen. När en mapp skapas så måste den omgivande strukturen finnas på plats, en djup mappstruktur skapas inte automatiskt. Det vill säga, om svnadmin load får kommandot att skapa mappen "trunk/www" så betyder det "skapa mappen 'www' i den redan existerande mappen 'trunk'". Finns då inte mappen "trunk" så stoppas hela processen. Eftersom strukturen tidigare låg i nivån direkt under roten ("/Generelltbestsystem"), men jag vill flytta ner det hela ytterligare en nivå ("/trunk/www") kommer dumpfilen som den nu ser ut inte att fungera. Därför måste jag lägga till ett kommando i dumpfilen för att skapa mappen "/trunk".

Öppna dumpfilen i emacs (tyvärr verkar inte BBEdit riktigt klara av detta, i varje fall inte i de fall där dumpfilen innehåller binära datafiler) och lägg till följande sektion, direkt före sektionen som skapar mappen "trunk/www":
Node-path: branches
Node-action: add
Node-kind: dir
Prop-content-length: 10
Content-length: 10

PROPS-END

Node-path: tags
Node-action: add
Node-kind: dir
Prop-content-length: 10
Content-length: 10

PROPS-END

Node-path: trunk
Node-action: add
Node-kind: dir
Prop-content-length: 10
Content-length: 10

PROPS-END


5) Dags att skapa det nya repositoryt "genbest":
svnadmin create svn-repositories/genbest

6) Bygg upp det nya repositoryt från den tillfixade dumpfilen:
svnadmin load svn-repositories/genbest < genbest-dumpfile

7) Kontrollera att det nya repositoryt ser ok ut med hjälp av svnlook:
svnlook info svn-repositories/genbest
och
svnlook tree svn-repositories/genbest

8) För att kunna logga in i det nya repositoryt via svnserve måste konfigurationsfilen för "genbest" ändras. Samtidigt passar jag på att se till så att de båda repositoryna använder sig av samma "passwd-fil", så slipper jag hålla på och uppdatera flera stycken olika.
- 8.1) Flytta passwd från "websystem-repositoryt" till rotmappen för mina repositoryn:
mv svn-repositories/websystem/conf/passw svn-repositories/passwd
- 8.2) Ändra konfigurationsfilen (svn-repositories/websystem/conf/svnserve.conf och svn-repositories/genbest/conf/svnserve.conf) i bägge repositoryna till:
[general]
anon-access = read
auth-access = write
password-db = /Users/admin/svn-repositories/passwd


Nu känner jag mig helt färdig, på alla sätt och vis…

Föregående | Startsidan | Arkivet | Epost | Följande

Kommentarer

Inga kommentarer inlagda

Lägg till kommentar

Tyvärr kan du inte lägga till kommentarer till notiser som är äldre än 4 veckor.

pihlan - Fredrik Pihlström bluddrar på