Davide Targa website

Programming, web development and open source

Migrazione Di Un Repository SVN a GIT

La migrazione di un repository svn a git può essere effettuata anche tramite git stesso con il comando git-svn. Il problema di questa strategia è che non vengono preservati i tag e i branch presenti nel repository svn. E’ pertanto opportuno usare uno strumento che preservi questi aspetti del repository anche nel passaggio a git. Svn2Git è una utility scritta in ruby e disponibile in forma di gemma (rubygem) che non è altro che un wrapper del comando git-svn in grado di convertire branch e tag svn in branch e tag su git. Vediamo come utilizzarla!

1 – Installazione delle dipendenze

Installiamo innanzitutto i pacchetti necessari. Avremo bisogno di git, svn e git-svn; quindi procediamo all’installazione con il comando:

1
sudo apt-get install git git-svn subversion

E’ poi necessario avere installato ruby e rubygems (va bene anche con rvm). Successivamente installiamo la gemma svn2git:

1
gem install svn2git

Ora siamo pronti per iniziare la migrazione del repository.

2 – Utilizzo

Supponiamo di avere una directory ~/code dove teniamo il nostro codice in sviluppo. Creiamo quindi una directory svn e una directory git dentro ~/code:

1
2
~/code$ mkdir svn
~/code$ mkdir git

ottenendo quindi:

1
2
3
4
~$ tree code/
code/
├── git
└── svn

Spostiamoci in ~code/git, creiamo una cartella con il nome del repository che vogliamo migrare (repo_name) e spostiamoci dentro di essa:

1
2
~/code/git$ mkdir repo_name
~/code/git$ cd repo_name

Lanciamo quindi la migrazione del repository con il comando:

1
~/code/git/repo_name$ svn2git http://svn.example.com/path/to/repo --verbose

Il comando svn2git può essere invocato con diverse opzioni sulla base della struttura del repository svn da cui si parte. Per informazioni sulle opzioni disponibili si può fare riferimento al README presente qui.

Il tool esegue in modo automatico il checkout del repository svn e la conversione a repository git mantenento branch e tag. Al termine dell’operazione nella cartelle di lavoro troveremo il repository git con il branch master allineato al trunk del repository svn.

3 – Controllo di integrità

Un ulteriore step che possiamo eseguire al fine di garantire l’integrità dei file e il corretto allineamento tra il trunk svn e il branch master di git è per mezzo del controllo e il confronto dell hash md5 di tutti i file sotto versioning. Per fare questo, spostiamoci quindi nel repository git appena creato e lanciamo il seguente comando:

1
2
~$ cd code/git/repo_name
~code/git/repo_name$ md5sum `find . -type f | grep -v ".git" | tr '\n' ' '` > sums.md5

Viene creato il file sums.md5 contenente appunto l’hash md5 di tutti i file del repository. Per eseguire il controllo spostiamoci ora nella cartella svn ed eseguiamo il checkout del trunk del repository svn:

1
2
3
4
5
~$ cd code/svn
~code/svn$ svn checkout http://svn.example.com/path/to/repo/trunk
...
...
Estratta revisione 123.

Spostiamoci quindi nella directory trunk e lanciamo il comando:

1
2
~$ cd code/svn/trunk
~code/svn/trunk$ md5sum -c ../../git/repo_name/sums.md5

Controlliamo l’output del comando e verifichiamo che non ci siano errori. In caso contrario è consigliabile rieseguire la procedura di reimportazione e di conversione. E’ da notare che in caso di presenza di altri branch, la verifica di integrità degli stessi va eseguita separataemtne.

4 – Rimozione del remote svn

All’interno del repository git appena creato è presente un riferimento remoto al repository svn che probabilmente vogliamo eliminare, infatti:

1
2
3
4
~$ cd code/git/repo_name
~code/git/repo_name$ git branch -a
* master
  remotes/svn/trunk

rimuoviamo il riferiemtno remoto a svn con il comando:

1
2
~code/git/repo_name$ git branch -rd svn/trunk
Deleted remote branch svn/trunk (was 317dd00).

5 – Inserimento dei riferimenti a origin sul repository git e push

Aggiungiamo origin ai remote:

1
~code/git/repo_name$ git remote add origin git@git.example.com:repo_name.git

Dovremmo quindi ottenere:

1
2
3
~code/git/repo_name$ git remote -v
origin  git@git.example.com:repo_name (fetch)
origin  git@git.example.com:repo_name (push)

Possiamo ora pushare il codice nel repository remoto origin con:

1
~code/git/repo_name$ git push origin master

Comments