News
sistema di controllo di versione

Controllo di versione: cos’è e a cosa serve

Che cos’è un Sistema di Controllo di Versione?

Un sistema di controllo di versione (VCS) o versioning ha come obiettivo principale quello di permettere agli sviluppatori di lavorare in contemporanea su uno o più file, garantendo:

  • la capacità di tenere sempre traccia delle modifiche effettuate sul progetto;
  • la possibilità di recuperare una copia della versione precedente, qualora ad esempio sia stato introdotto un errore ed è necessario ripristinare l’ultima versione del progetto;
  • l’opportunità di segnalare eventuali conflitti e di aggiungere delle spiegazione e delle note alla modifiche apportate. Generalmente, queste note sono inserite per specificare il perché di quelle correzioni o per indicare eventuali criticità o informazioni utili da dover comunicare all’intero team di lavoro.

Software di Controllo di Versione: i più conosciuti

Tra i più conosciuti software di controllo di versione in ambiente open source ci sono Subversion e GIT.

Subversion è un software gratuito, opensource ed erede di CVS (Concurrent Version System).
Nasce nel 2000 con l’intento di risolvere i bug e i difetti intrinsechi di CVS.

Rispetto a CVS, Subeversion si caratterizza innanzitutto per la capacità di tenere traccia anche del contenuto di ogni singola directory; in questo modo, lo spostamento di un file è considerata una modifica, quindi reperibile e convertibile.

In più, considerando che le modifiche sono applicate solo in blocco, anche se soltanto una di esse dovesse creare errori, non verrebbe applicata nessuna delle modifiche inviate.
Inoltre, è possibile assegnare a file e directory delle proprietà personalizzate (metadati) e mantenere lo storico anche delle modifiche ad esse attribuite.

GIT, invece, è stato sviluppato nel 2005 da Linus Torvalds. Si tratta di un DVCS (Distributed Version Control System), cioè sistema software per il controllo di versione distribuito. È stato pensato per essere facile da usare e per essere particolarmente veloce.

Rispetto ad altri sistemi di controllo di versione, Git funziona diversamente. Infatti, se gli altri sistemi sono stati sviluppati per memorizzare informazioni sotto forma di elenchi in grado di riportare i cambiamenti subiti dai progetti gestiti, in Git i dati vengono rappresentati come delle istantanee, o snapshots. Questo significa che, quando si memorizza lo status di un progetto, il sistema crea un’immagine di tutti i file in quell’istante momento. Git, in altre parole, non fa riferimento alle differenze tra le varie versioni, ma ne immortala gli stati di avanzamento.

Il vantaggio a livello di efficienza è evidente: nel caso in cui un file non dovesse subire delle modifiche, il DVCS non provvederà a salvarlo nuovamente ma si limiterà a definire un collegamento con il salvataggio già effettuato.

Sistemi di controllo locali, centralizzati e distribuiti

Esistono diversi sistemi di controllo di versione: dal semplice monitoraggio locale a sistemi centralizzati, fino al versioning distribuito.

Sistema di Controllo di Versione Locale

Il controllo di versione locale è una delle forme più semplici di versioning.

Nel momento in cui uno sviluppatore lavora su un progetto a cui successivamente vi apporta delle modifiche, le due versioni del progetto sono salvate in differenti cartelle rinominandole differentemente – ad esempio con la data dell’ultima correzione effettuata –

Quando il progetto è più articolato e coinvolge più sviluppatori come vengono gestite invece le numerose modifiche? Il rischio è quello di perdere alcuni degli interventi effettuati e di accumulare una serie di errori.

Per ovviare a questo problema, uno dei primi e più popolari strumenti di VCS utilizzato è stato l’RCS (Revision Control System).
L’RCS funziona destinando un database alle modifiche registrate che sono state apportate ai file e grazie a delle patch che memorizzano le differenze tra le revisioni in modo da semplificare le operazioni di ripristino.

Se da un lato, l’RCS facilita il controllo di versione locale, dall’altro sono pochi gli strumenti che offre dal punto di vista collaborativo. Difatti, soluzione alternativa a tale problematica è stata il ricorso ai CVCS (Centralized Version Control Systems).

Sistema di Controllo di Versione Centralizzato

Un sistema di controllo di versione centralizzato si caratterizza per funzionare sulla base di un unico server che ha come compito quello di ospitare tutte le modifiche effettuate sui progetti e sottoposti a versioning.

Tali sistemi offrono una serie vantaggi rispetto ai sistemi di controllo di versione locale. Innanzitutto, se si considera la partecipazione di più soggetti ad un progetto, con un sistema di controllo di versione centralizzato è più semplice tenere traccia delle correzioni apportate dagli altri. Inoltre, gli amministratori possono decidere a chi concedere determinati privilegi di accesso e scrittura ai file.

I sistemi di controllo di versione centralizzati hanno però un limite. Poiché tutti i dati si trovano tutti nel sistema centrale e risiedono nella medesima posizione, in caso di malfunzionamento dell’unità centrale, c’è il rischio che tutti i file presenti risultino inutilizzabili da parte di qualsiasi utente.

Sistema di Controllo di Versione Distribuito

Abbiamo già accennato ai sistemi di controllo di versione distribuiti parlando di Git.

A caratterizzare questi sistemi è la presenza di repository, una sorta di archivio di raccolta dei dati di un determinato progetto. Questa tipologia di sistemi prevedono che il controllo degli ultimi snapshot venga affidato ai client che eseguiranno delle copie complete dei repository.

Il vantaggio di questo meccanismo è chiaro: in caso di un’interruzione del servizio da parte dei server, il repository presente in un client qualunque potrà essere utilizzato per il ripristino.

La dinamica descritta è possibile grazie ad un’apposita funzionalità per la creazione di backup completi denominata checkout dei repository, ovvero si parla della realizzazione della copia di un repository locale o di un server remoto tramite un comando per la sua clonazione.

A rendere vantaggioso un approccio basato sul controllo di versione distribuito è la possibilità di operare su più repository in remoto. In questo modo, si avrà l’opportunità di lavorare in contemporanea sul medesimo progetto con gruppi di collaboratori differenti seguendo diverse metodiche.