Conversione a Git

Git convert: un passaggio della migrazione da SVN a Git

Il passaggio successivo della migrazione da SVN a Git consiste nell'importare i contenuti del repository SVN in un nuovo repository Git. Per farlo, useremo l'utilità git svn, inclusa nella maggior parte delle distribuzioni Git, e puliremo quindi i risultati con svn-migration-scripts.jar.

Tieni presente che il processo di conversione può richiedere una notevole quantità di tempo per i repository più grandi, anche quando si effettua la clonazione da un repository SVN locale. Come standard di riferimento, ricorda che per completare la conversione di un repository da 400 MB con 33.000 commit sul branch principale sono state necessarie circa 12 ore.

Per i repository di dimensioni normali, devono essere eseguiti i seguenti passaggi sul computer locale del responsabile della migrazione. Tuttavia, se hai un repository SVN molto grande e vuoi ridurre i tempi di conversione, puoi eseguire git svn clone sul server SVN anziché sul computer locale del responsabile della migrazione per evitare il sovraccarico causato dalla clonazione tramite una connessione di rete.

Clonare il repository SVN

Il comando git svn clone trasforma il trunk, i branch e i tag del repository SVN in un nuovo repository Git. Tale comando deve essere configurato diversamente a seconda della struttura del repository SVN.

Migrazione a Git: comando git svn clone

Layout SVN standard

Se il progetto SVN usa il layout di directory /trunk, /branches e /tags standard, puoi utilizzare l'opzione --stdlayout invece di specificare manualmente la struttura del repository. Esegui il comando seguente nella directory ~/GitMigration:

git svn clone --stdlayout --authors-file=authors.txt
 <svn-repo>/<project> <git-repo-name>

Where <svn-repo> is the URI of the SVN repository that you want to migrate and, <project> is the name of the project that you want to import, and <git-repo-name> is the directory name of the new Git repository.

Ad esempio, se stavi migrando un progetto chiamato Confluence, con host su https://svn.atlassian.com, è consigliabile eseguire quanto segue:

git svn clone --stdlayout --authors-file=authors.txt https://svn.atlassian.com/Confluence ConfluenceAsGit

Layout SVN non standard

Se il layout del repository SVN non è un layout standard, occorre specificare le posizioni del trunk, dei branch e dei tag usando le opzioni della riga di comando --trunk, --branches e --tags. Ad esempio, se ci sono dei branch archiviati sia nella directory /branches che nella directory /bugfixes, usa il seguente comando:

git svn clone --trunk=/trunk --branches=/branches 
 --branches=/bugfixes --tags=/tags --authors-file=authors.txt 
 <svn-repo>/<project> <git-repo-name>

Ispezionare il nuovo repository Git

Al termine di git svn clone (l'operazione potrebbe richiedere del tempo), troverai una nuova directory chiamata in ~/GitMigration. Questo è il repository Git convertito. Dovresti essere in grado di passare a ed eseguire uno qualsiasi dei comandi Git standard per esplorare il progetto.

I branch e i tag non vengono importati nel nuovo repository Git come ci si potrebbe aspettare. Non troverai nessuno dei branch SVN nell'output di git branch, né troverai nessuno dei tag SVN nell'output di git tag. Ma, se esegui git branch -r, troverai tutti i branch e i tag del repository SVN. Il comando git svn clone importa i branch SVN come branch remoti e importa i tag SVN come branch remoti con prefisso tags/.

Migrazione a Git: struttura del repository Git clonato

Questo comportamento semplifica alcune procedure di sincronizzazione bidirezionale, ma può creare molta confusione quando si tenta di effettuare una migrazione unidirezionale a Git. Ecco perché il prossimo passaggio sarà convertire questi branch remoti in branch locali e tag Git effettivi.

Pulire il nuovo repository Git

Lo script clean-git incluso in svn-migration-scripts.jar trasforma i branch SVN in branch Git locali e i tag SVN in tag Git completi. Nota che questa è un'operazione distruttiva e che non potrai rispostare i commit dal repository Git al repository SVN.

Se decidi di seguire questa guida alla migrazione, ciò non rappresenta un problema in quanto la guida consiglia di effettuare una sincronizzazione unidirezionale da SVN a Git (il repository Git è considerato di sola lettura fino a dopo la fase di migrazione). Tuttavia, se hai intenzione di eseguire commit nel repository Git e nel repository SVN durante il processo di migrazione, non è consigliabile eseguire i seguenti comandi. Si tratta di operazioni avanzate, non consigliate per i progetti standard.

Per vedere cosa può essere pulito, esegui il comando seguente in ~/GitMigration/:

java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git

Restituisce come output tutte le modifiche che lo script vuole apportare, ma senza applicarne nessuna. Per eseguire queste modifiche, occorre usare l'opzione --force in questo modo:

java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git --force

Ora dovresti vedere tutti i branch SVN nell'output di git branch, insieme ai tag SVN nell'output di git tag. Ciò significa che hai convertito correttamente il progetto SVN in un repository Git.

Riepilogo

In questo passaggio, hai trasformato un repository SVN in un nuovo repository Git con il comando git svn clone, quindi hai pulito la struttura del repository risultante con svn-migration-scripts.jar. Nel passaggio successivo, scoprirai come mantenere questo nuovo repository Git sincronizzato con qualsiasi nuovo commit nel repository SVN. È un processo simile a quello di conversione, ma ci sono alcune considerazioni importanti sul flusso di lavoro da tenere presente durante questo periodo di transizione.

Pronto per imparare a utilizzare Git?

Prova questo tutorial interattivo.

Inizia ora