I sistemi di controllo di versione supportano gli utilizzatori di computer nell’importante compito di organizzare e tracciare le modifiche di quanto si produce e lo fanno seguendo tutti gli stessi principi base. Come evidenziato in un precedente articolo, ogni software di gestione delle versioni ha delle peculiarità. In questo articolo entreremo nel merito delle principali differenze che riguardano le due famiglie di sistemi di controllo di versione: centralizzati e distribuiti.
Per comodità faremo riferimento a SVN per i sistemi centralizzati e GIT per quelli distribuiti, tenendo presente che le stesse considerazioni possono essere estese anche ad altri programmi delle famiglie.
La prima differenza importante è sul modello di dati utilizzato dai programmi per gestire le modifiche ai file.
SVN, come la maggior parte dei sistemi omologhi, tratta le informazioni di versione come una catena di modifiche applicate ai singoli file. Cioè, in caso di avanzamento di versione (commit), vengono tracciate solo le variazioni ai file realmente modificati rispetto alla versione precedente.
GIT, invece, considera i dati come una serie di fotografie (o snapshot) del filesystem sottoposto al controllo di versione. Ogni volta che viene eseguito un commit, GIT analizza i cambiamenti ai singoli file sotto controllo, creando una struttura logica ad albero che mappa la struttura del filesystem. La struttura dati creata sarà composta dai file che hanno subito una variazione rispetto alla versione precedente, ed solo il riferimento all’ultima versione modificata dei file che non sono stati oggetto di commit. Pertanto ad ogni commit avremo sempre uno snapshop di tutto il repository e non solo dei file modificati.
Un sistema di controllo centralizzato ha la necessità di conservare in locale solo le informazioni per raggiungere il repository remoto. Tutte le modifiche successive vengono conservate direttamente sul database remoto.
Un sistema distribuito come GIT, per condividere le proprie informazioni di versione con i repository remoti deve necessariamente averle prima disponibili in un database locale. A differenza di un sistema centralizzato, che richiede un solo commit per propagare le informazioni di versione, un sistema di controllo distribuito deve prima riportarle in locale e successivamente inviarle ai server remoti. La prima operazione è effettuata con un commit, la seconda avviene con una operazione di push.
Se da un lato è evidente la maggiore complessità di un sistema distribuito rispetto ad uno centralizzato, è altrettanto evidente la maggiore flessibilità di programmi di versioning tipo GIT che consentono di operare anche in assenza di connessione alla controparte remota. Per questo motivo, sistemi come GIT sono stati ampiamente utilizzati come sistem di controllo versione integrati negli IDE di sviluppo.
Autore
Vincenzo Tirelli
Innovation Manager – Senior Software Designer
Ho iniziato a collaborare con la SNAP a partire dal 2007, in qualità di ...