Subversion 4 Dummies

Questo piccolo articolo tecnico di basso livello vuole essere poco più di un introduzione al sistema di versioning che attualmente utilizzo per i miei progetti: subversion.

Implicazioni della parola Versioning

Difficilmente, specialmente per progetti reali, i singoli componenti del progetto stesso nascono e muoiono in un unica sessione di lavoro. Il ciclo standard di creazione di un file (del progetto) è di fatto un pò più complesso e comprende:

  • Creazione e primo commit, ossia inserimento del file nel progetto
  • Modifica del file in seguito a risoluzione di bugs od ottimizzazioni

Questo significa che di fatto il singolo file subisce numerose modifiche lungo la sua vita. Versioning vuol dire che ogni modifica del file è tracciata al fine di poter tornare, ad esempio, ad uno stato del file precedente a quello attuale per qualsivoglia motivo. Inoltre, se ci comportiamo “bene” ed alleghiamo un commento ad ogni aggiornamento del file, possiamo tracciare anche il motivo per cui abbiamo fatto una determinata modifica.

Concetti base

Ci sono alcuni termini che è bene conoscere parlando di versioning.

Repository è il contenitore dei files relativi al progetto. Solitamente contiene il progetto in se più i files di configurazione dello stesso (la configurazione relativa al progetto PER subversion, quindi le password di accesso degli utenti, i permessi e la pubblicità del progetto stesso).

Import è l’azione eseguita per inizializzare un path come repository.
Checkout si esegue quando per la prima volta si copia localmente il progetto dal repository. E’ indispensabile per iniziare a lavorarvi sopra.
Update è l’azione compiuta solitamente prima di iniziare a lavorare su qualche file, per assicurarci che la copia locale sia sincronizzata con quella del repository.
Commit significa sostanzialmente inviare i files modificati localmente al repository. Ogni volta che si esegue il commit di un file, la sua versione viene incrementata di una unità e viene rimosso il lock che non permette ad altri utenti di modificarlo a sua volta.

Diff mostra le differenze tra la copia locale e quella remota.

Ogni azione viene compiuta tramite un manipolatore ed un URL. Subversion supporta vari protocolli di accesso a repository remoti. I più usati sono:

  • file:// per accedere a risorse locali (seguito quindi da un identificatore di directory assoluto)
  • http:// usato per accedere tramite il protocollo WebDav a repository con un server web configurato per l’accesso al repository locale.
  • https:// simile al precedente, ma fa uso del protocollo SSL (viene usato spesso per impostare delle politiche di accesso al repository un pò più robuste della solita coppia username e password tramite canale in chiaro)
  • svn:// permette l’accesso al repository remoto tramite il protocollo apposito di SVN, esposto tramite il demone svnserve.
  • svn+ssh:// come sopra, ma il canale è cifrato con l’utilizzo di ssh (scomodo in quanto richiede un accesso shell non indipendente dal login di sistema presso la macchina che gestisce il repository)

In pratica

Tipicamente dovremmo innanzitutto inizializzare un repository tramite il comando svnadmin create /svnrepos/progetto1, successivamente importeremo il progetto base con svn import /tmp/copialocale svn://10.0.0.1/svnrepos/progetto1 -m ‘Commento per la prima importazione’.

Fatto questo, possiamo cancellare la copia del progetto iniziale, che abbiamo messo in /tmp/copialocale, per passare al checkout della copia dal repository con svn checkout svn://10.0.0.1/svnrepos/progetto1/trunk. Come avrete notato, al path remoto del progetto, ho aggiunto la parola “trunk”, che di fatto è quella che contiene il progetto, in quanto, durante l’import iniziale, il progetto va inserito dentro un layout ben preciso.

Consideriamo che il progetto sia composto da 4 files: index.php, config.php, style.css, script.js. Dovremmo creare una struttura di questo tipo in una dir temporanea (/tmp nel mio caso):

  • /tmp/proj/trunk dentro il quale andranno i 4 files di sopra
  • /tmp/proj/branches vuota
  • /tmp/proj/tags vuota

A questo punto, possiamo dare l’import.

Webografia:

  • Subversion software di versioning.
  • Subclipse plugin per Eclipse per integrare le funzionalità di subversion.