Controllo di Versione con Mercurial

Il controllo di versione è uno strumento molto utile per chi sviluppa costantemente in team. Tiene traccia di ogni singola modifica a ogni file, evidenziandone i cambiamenti, e permette in ogni istante la possibilità di effettuare un rollback di versione del singolo file.
Esistono diversi prodotti che permettono di effettuare un controllo di versione ma ultimamente due prodotti in particolare stanno prendendo sempre più piede (git e mercurial), surclassando cvs, subversion e simili. Questo articolo prenderà in esame “mercurial”, praticamente identico a git, se non per l’uso di alcuni comandi. In questi sistemi, denominati “Sistemi di Controllo di Versione Distribuiti” (DVCS), i client non solo controllano lo snapshot più recente dei file, ma fanno una copia completa del repository. In questo modo se un server morisse e i sistemi interagiscono tramite il DVCS, il repository di un qualsiasi client può essere copiato sul server per ripristinarlo. Ogni checkout è un backup completo di tutti i dati.

Risulta essere fondamentale però capire il funzionamento di un Sistema di controllo di versione distribuito. Ogni file in Mercurial (o Git) può essere in tre stati: committed (committati), modified (modificati) e staged (in stage). Committato vuol dire che il file è al sicuro nel db. Modificato significa che il file è stato modificato, ma non è stato ancora committato nel database. In stage significa che hai contrassegnato un file, modificato nella versione corrente, perché venga inserito nello snapshot alla prossima commit. Vengono così definite le tre sezioni principali di un progetto: la directory di Mercurial, la directory di lavoro e l’area di stage.

Directory di Mercurial – All’interno vengono salvati i metadati e il database degli oggetti del tuo progetto. E’ la parte più importante del DVCS ed è ciò che viene copiato quando si clona un repository da un altro computer.

Directory di lavoro – E’ un checkout di una versione specifica del progetto.

Area di stage – E’ un’area nella quale vengono salvate tutte le informazioni riguardandi la tua prossima commit. A volte viene indicato anche come ‘indice’.

Il workflow di un progetto di base di mercurial funziona quindi in questo modo:

1) Modifica i file nella tua directory di lavoro
2) Fanne lo stage, aggiungendone le istantanee all’area di stage
3) Committa, in maniera tale da salvare i file nell’area di stage in un’istantanea (snapshot) permanente nella tua directory di Git.

Presupponendo che il prodotto sia già installato sul vostro server, bisognerà innanzitutto configurare l’utenza che effettuerà i commit. Modificate il file ~/.hgrc (in Windows %USERPROFILE%/Mercurial.ini) creando le righe

[ui]
username = John Doe <john@example.com>

In questa maniera ogni volta che effettuerete il commit da questa postazione, verrà anche memorizzato l’utente che ha fatto la modifica, con il relativo indirizzo di posta elettronica.

A seconda ora che vi troviate sul sistema principale di sviluppo o se volete clonare un progetto già esistente, dovrete procedere in due maniere differenti. Innanzitutto vediamo la prima ipotesi.

Posizionatevi nella directory principale di lavoro del progetto e digitate il comando:

$hg init

in questa maniera verrà creata una directory nascosta denominata .hg con all’interno tutte le informazioni che serviranno a mercurial a tenere traccia di tutte le modifiche.
Dovrete ora specificare quali sono i file di cui vorrete tenere traccia. Questa operazione è possibile effettuarla attraverso il comando “hg add nomefile”. Decidiamo di tenere traccia di tutti i file presenti (con relative subdirectory):

$hg add *

Potete ora effettuare la vostra prima commit, denominata commit iniziale

$hg commit -m “Commit iniziale”

Per vedere lo stato di tutte le commit effettuate, basta digitare il comando

$hg log

In questa maniera viene visualizzato anche il codice della commit da richiamare per un eventuale rollback.

Esistono diverse gui che si interfacciano a Mercurial e Git. Una di queste è SourceTree. Risulta essere freeware, gira sia su ambienti Windows che su ambienti Mac e l’ho trovata molto semplice e intuitiva.