Archivi tag: svn

Tempo di migrazioni: trasformare un repository da svn a git

Un paio di giorni fa ho finalmente deciso di buttare a mare un vecchio repository svn per abbracciare git anche nell’ultimo progetto dove non lo utilizzavo, ecco quindi un sintetico tutorial su come trasformare un repository svn in repository git. Da parte mia ho seguito il tutorial di Atlassian, che però è abbastanza lungo e non tutti i passi erano necessari al mio scopo: trasformare un repository svn in repository git, una volta e per sempre, abbandonando poi il vecchio repository ma mantenendo tutto lo storico e gli utenti del vecchio repository.

Lo strumento

Di modi per fare questa trasformazione ce ne saranno parecchi, io ho usato il svn-migration-scripts.jar messo a disposizione da Atlassian, un classico eseguibile Java.
Scaricatelo e mettetelo nella home o dove preferite, ma tenente presente che i comandi seguenti sono stati scritti avendo il jar nella home dell’utente.

La preparazione

Detto che una migrazione andrebbe fatta in un momento idoneo possibilmente durante il quale il repository origine rimarrà inalterato, che dovrebbe essere eseguita da chi di dovere, e che se si vuole velocizzare le operazioni bisognerebbe lavorare sulla stessa macchina del repository svn o quantomeno nella stessa lan, ipotizziamo che sia tutto a posto e iniziamo.

Per prima cosa bisogna verificare le precondizioni, ovvero accertarsi che sul sistema ci sia tutto il necessario per eseguire la conversione.
Eseguendo il jar con il parametro “verify” viene controllato il sistema con stampa a video delle eventuali mancanze.
java -jar ~/svn-migration-scripts.jar verify
Se state eseguendo la migrazione su un Mac bisogna prima creare e montare un disco case-sensitive, sul quale sarà creato il nuovo repository:
java -jar ~/svn-migration-scripts.jar create-disk-image 5 GitMigration
L’esecuzione di questo comando crea un disco chiamato “GitMigration”

Mapping degli utenti

Nel vecchio repository i commit erano associati a utenti identificati da un nome, ma su git gli utenti sono identificati da nome e email. Andiamo quindi a creare – dentro il disco virtuale creato al passo precedente – un file authors.txt contenente il mapping tra vecchi e nuovi utenti.
cd GitMigration
java -jar ~/svn-migration-scripts.jar authors svn://repository_url/repository_name > authors.txt
Questo crea un file di mapping contente sulla sinistra i nomi degli utenti presenti sul vecchio sistema, e sulla destra i nomi e le email da usare sul nuovo sistema. Naturalmente quelli di destinazione sono solo ipotesi, e infatti le email sono di pura invenzione (le email sono tutte nella forma “username@mycompany.com”). Andiamo quindi a sostituire le email e se vogliamo i nomi degli utenti, salviamo e passiamo al punto successivo.

Clonazione del repository

È finalmente giunto il momento della trasformazione… ma qui lo script di Atlassian ci abbandona e il git inizia a farla da padrone.
Se il repository svn di partenza ha una struttura standard, con un “trunk” contenente il codice del ramo principale, una cartella “tags” contenente tutti i tags e così via possiamo lanciare il comando seguente, con parametro “stdlayout”.
git svn clone --stdlayout --authors-file=authors.txt svn://repository_url/repository_name new_repository_name
Se al contrario abbiamo una struttura non così standard possiamo andare a specificare dove devono essere letti i dati relativi a trunk, branches e tags. Nel mio caso il trunk non era presente perché i sorgenti del ramo principale erano semplicemente in una cartella nella root del repository, quindi non ho potuto usare il parametro “–stdlayout” e ho dovuto specificare le destinazioni delle varie cartelle.
git svn clone --trunk=/folderName --branches=/branches --tags=/tags --authors-file=authors.txt svn://repository_url/repository_name new_repository_name

La trasformazione generalmente richiede alcuni minuti, pochi se avete solo qualche centinaio di commit e siete in lan (o meglio ancora sulla stessa macchina del repository), molti di più se state lavorando con un repository enorme che risiede dall’altra parte del mondo.
Al termine dell’esecuzione nel disco virtuale “GitMigration” comparirà il neonato repository git, ovvero una cartella contenente i sorgenti e tutti i dati necessari a git (la cartella nascosta .git).

Pulizia del repository git

Il repository git creato al passo precedente è ancora “collegato” a svn, infatti l’origin punta al vecchio repository e tutto è “costruito” in modo da poter continuare a centralizzare i commit sul vecchio repository.
Se il nostro obiettivo è quello di tagliare i ponti con il passato, abbandonare svn e creare un nuovo origin git, quello che dobbiamo fare ora è lanciare lo script necessario per trasformare branches e tags nel classico formato git.
java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git --force

Creazione di un nuovo origin

La trasformazione è ormai compiuta e non ha più senso mantenere nel nuovo repository un riferimento al vecchio repository svn, conviene quindi eliminare l’origin e crearne uno nuovo.
Andiamo quindi a creare sul server più adatto a mantenere una copia dei nostri sorgenti un repository git.
Spostiamoci sul server, creiamo una cartella repository_name.git, settiamone i permessi/gruppi/proprietario, e inizializziamo il repository con il comando git init --bare repository_name.git.
A questo punto non resta altro da fare che modificare l’origin del repository git sostituendo l’url del vecchio repository svn con quello del repository remoto appena creato (utilizzando il protocollo che riteniamo più adatto, nel mio caso l’ssh), eseguire il primo push e il gioco è fatto.

Come server dei sorgenti nessuno ci vieta di utilizzare servizi web come BitBucket o GitHub, ma se il cloud vi fa paura un server linux in locale va benissimo, anche perché essendo git un sistema decentralizzato e distribuito eventuali problemi al server non sarebbero la fine del mondo.

Se al termine qualcosa non vi torna (ad esempio non riuscite a togliere il vecchio origin come è successo a me) un nuovo clone del repository remoto non guasta, anche per verificare che sul server sia tutto a posto.

Conclusioni

Nessuno ci obbliga a sostituire il sistema che usiamo per fare il versioning dei nostri progetti, ma se inizierete a usare git vedrete che il gioco vale la candela e presto o tardi ne sentirete la mancanza quando dovrete tornare all’svn o peggio a sistemi ancora più vecchi. Si può decidere di trasformare il repository in git continuando a mantenere svn sul server, ma secondo me se si decide di cambiare conviene farlo in modo netto, e con i semplici passi che ho elencato la transizione dovrebbe essere veloce e indolore.

Il passato che avanza: SVN su Eclipse

Articolo forse un po’ anacronistico, ma tutte le volte che devo collegarmi a un repository SVN con Eclipse o uno dei suoi tanti figli (come ad esempio Titanium Studio), non mi ricordo mai di preciso dove trovare l’apposito plugin.

Detto che nel 2015 è possibile e forse doveroso trasferire i propri sorgenti su un VCS distribuito in stile GIT, anziché continuare a tenerli su un sistema centralizzato, è anche vero che in alcuni casi questo passaggio non si può fare.
Di client SVN ce ne sono tanti, per Windows uno dei più diffusi è TortoiseSVN, ma parlando di plugin per Eclipse (che non ha un client SVN integrato) la strada è più o meno obbligata.

L’installazione di plugin su Eclipse

Senza andarsi a sporcare le mani con file e directory di Eclipse, ci sono due modi per installare dei plugin dall’interno di Eclipse: il menù “Install New Software” e il vicino “Eclipse Marketplace”.

Il menù help con le voci per l'installazione di plugin

Il menù help con le voci per l’installazione di plugin


Il Marketplace – presente sulle versioni standard di Eclipse – è il modo più semplice per trovare plugin sicuramente funzionanti e di buon livello, ma purtroppo non è sempre presente in Eclipse. Infatti in alcune versioni modificate (vedi Titanium Studio) questa voce di menù non c’è proprio. Se siamo in uno di questi casi o se il plugin che ci interessa non è disponibile sul Marketplace, si può ricorrere al più spartano “Install new software”.

Maschera di installazione di plugin su Titanium Studio, identica nell'Eclipse standard

Maschera di installazione di plugin su Titanium Studio, identica nell’Eclipse standard


Il funzionamento è abbastanza ovvio, su “Name” si inserisce un nome identificativo della risorsa, su “Location” l’url al quale si trova il plugin.
Una volta registrata la location, nella maschera sottostante rimane da mettere le spunte sui componenti (eventuali) che si desidera installare e confermare l’installazione.

Installazione di Polarion Subversive

Il client SVN installabile su Eclipse che la fa da padrona è il Subversive SVN. Scaricabile dal Marketplace, è però disponibile anche per l’installazione manuale.
Nella pagina qui sopra ci sono tutti i link necessari, ma per farvela più semplice le cose che dovete installare sono due:
http://download.eclipse.org/technology/subversive/2.0/update-site/ – [required] Subversive plug-in
http://community.polarion.com/projects/subversive/download/eclipse/4.0/update-site/ – [required] Subversive SVN Connectors

Le cose che dovreste avere installate a questo punto per far funzionare SVN

Le cose che dovreste avere installate a questo punto per far funzionare SVN


Il connettore da usare dipende dal server, nel dubbio installateli tutti. Si può scegliere quale utilizzare anche successivamente.
Selezione del connettore da utilizzare

Selezione del connettore da utilizzare

Primi passi con il plugin

Siamo nel 2015, GIT esiste da un pezzo, e creare nuovi repository SVN equivale a incastrarsi le palle nel cassetto. Quindi se siete arrivati in questo punto probabilmente vi interessa solo collegarvi a repository già esistenti.
Aggiungete quindi la view “SVN Repositories” da qualche parte sul vostro Eclipse (Window -> Show View -> Other -> SVN -> SVN Repositories), e registrate una “repository location”.

Maschera per la registrazione di un repository già esistente

Maschera per la registrazione di un repository già esistente


A questo punto selezionate all’interno del repository ciò che vi interessa (generalmente un progetto) e fatene il checkout.
Essendo il progetto pieno di cartelline nascoste .svn, Eclipse capisce che si tratta di un lavoro sotto SVN e nella voce di menù “Team” aggiunge tutti gli strumenti propri di SVN.
Subversive-team-menu

Per finire

Se non avete mai usato SVN e non avete ancora messo i vostri sorgenti sotto controllo di versione ignorate tutto quanto letto fin qui e studiatevi direttamente GIT.