Abstract
In questo articolo presentiamo e confrontiamo diversi tool per il controllo
di revisione del software: CVS, SubVersion, BitKeeper, SourceSafe e
ClearCase.
Data di stesura: 05/12/2002
Data di pubblicazione:
10/12/2002
Ultima modifica: 04/04/2006
Introduzione: perché serve un tool di controllo di revisione
In prima battuta, un software di controllo di revisione è uno strumento
atto a tenere traccia le modifiche fatte sul codice, e assegnare delle versioni
ai file (sorgenti, documenti e quant'altro).
È possibile richiamare una versione precedentemente archiviata,
indicando una data o una label simbolica (esempio VERSIONE_1_2).
Spesso a tali tool sono affiancati dei software di bug tracking, in grado
cioè di raccogliere i bug trovati dagli utenti, elencarli, ordinarli per
priorità eccetera. Un buon esempio di tali tool è
Bugzilla[8].
Un buon software di controllo di revisione deve anche essere in grado di
risolvere i conflitti che nascono quando più sviluppatori (li chiameremo
"Bill" Jobs e "Steve" Gates) modificano lo stesso codice, per adattarlo ad
esigenze differenti.
In generale ogni sviluppatore ha una sua "copia di lavoro" e un repository da
cui prende i file che deve alterare (checkout) e inserisce versioni funzionanti
(checkin) annotando quello che ha fatto.
Un aspetto importante e non trascurabile di tali strumenti è il supporto
di tool visuali.
Infatti mentre un compilatore senza un ambiente visuale può essere ugualmente
produttivo, un tool di controllo di revisione che non riesca a esprimere in
modo grafico la complessità e le iterazioni tra le varie versioni di un
progetto rende più difficile capire quali azioni intraprendere in caso di
conflitti, soprattutto se il numero di sviluppatori è maggiore di due o tre.
Tool Open Source
CVS
Si tratta di un tool open source affidabile, ed è usato dal 99% dei progetti
GNU/LGPL/Open Source: anche perché è l'unica alternativa valida.
Derivato da RCS, ne condivide i punti di debolezza, tra cui il fatto che
gira male sotto Windows: la cygnus ha fatto il porting, ma per usarlo in
modo distribuito è necessaria una macchina unix.
CVS è in grado di supportare in modo efficace i branch ("diramazioni" di
sviluppo rispetto alle revisioni principali) e di eseguire complesse
operazioni.
Per esempio è possibile estrarre il branch "Versione-Veloce" per la
sottodirectory src/ottimizzato e l'ultima versione stabile su
src/funzionoNonToccarmi.
Il fatto che possa eseguire l'aggiornamento dei soli file modificati lo
rende ideale per chi dispone di lente connessioni (es via modem).
Il database di CVS è file based, la qual cosa comporta:
CVS è intrusivo perché crea le famose directory "CVS" nella vostra copia di
lavoro. Questa caratteristica è condivisa con quasi tutti i tool che
esamineremo, e anche se non dà troppo fastidio va annotata.
Se il database si corrompe, con un minimo di perizia è facile risolvere
problemi (per esempio dei lock che non scadono). Parimenti è facile creare
tool che si integrino con CVS, e quasi tutti gli IDE free e commerciali
lo supportano nativamente o tramite plug-ins.
La velocità non è il suo forte. Solo per sapere quali file sono stati
modificati nella vostra copia di lavoro, preparatevi a delle attese.
La semantica di lock è debolissima, non si possono fare checkout veramente
riservati.
Per la stessa ragione CVS non è atomico: cioè se "Bill" sta mettendo in
checkin i file 1,2,3 e qualche millesimo di secondo dopo "Steve" esegue un
update e il checkin del file 4, non vi è garanzia che Steve riceva TUTTI
gli aggiornamenti: potrebbe ricevere solo i nuovi file 1,3. Allo stesso modo
Bill potrebbe ricevere come non ricevere l'aggiornamento del file 4.
CVS non versiona le directory, perché implementativamente le directory sono
i suoi "database modules" e i loro nomi sono sono belli cablati nel
repository.
Il problema peggiore di CVS è il fatto che non versiona le directory. Questo
infatti porta le seguenti conseguenze:
Non è possibile cambiare il nome di un file. Per esempio se voglio spostare
la revisione 3 di src/org/siforge/SmartSync.java in
src/org/siforge/sm/SmartSync.java.
La "geniale" soluzione di CVS consiste nel cancellare il primo file e creare
il secondo. Il repository così registra che dalla data corrente non esiste
più la revisione 3 di src/org/siforge/SmartSync.java ed è
stato aggiunto un file diverso di nome
src/org/siforge/sm/SmartSync.java con revisione 1.
Registrare in modo sicuro che si tratta dello stesso file è impossibile:
bisogna usare i commenti, e questo è scomodo.
La soluzione corretta sarebbe quella di versionare le direcory
src/org/siforge/ e src/org/siforge/sm/ registrando lo spostamento
dell'oggetto SmartSync.java, che continua ad avere la sua revision history.
Cambiare il nome di una directory è ancora più tragico. Se si vuole
spostare la directory src/ContengoMilleFileInMilleDirectory/ in
src/modulo/ContengoMilleFileInMilleDirectory/ dovete farlo a
mano ... spostando i singoli file come nel precedente punto (1).
Si capisce che tale cosa diventa inapplicabile per progetti di medie
dimensioni o con un vettore del cambiamento molto elevato sviluppati con
metodologie "agili" come eXtreme Programming.
SubVersion
SubVersion[2] è ancora in alfa; nonostante
questo gli sviluppatori pensano che
si possa iniziare ad usarlo[3].
Risolve molti dei limiti di CVS ed inoltre:
Il repository è un vero database.
Supporta anche un interfaccia remota basata su WebDav.
Permette di aggiungere proprietà ai singoli files.
È pensato per una rapida transizione per chi conosce CVS: La sintassi dei
comandi è molto simile a quella di CVS, e il team è conscio del fatto che
dovrà costruire dei tool per consentire la migrazione da CVS.
SubVersion non supporta in modo esplicito il concetto di tag (label) o branch.
In SubVersion le directory vengono incrementate di revisione "in blocco": si
parla di directory tree. Questo consente di sviluppare il codice nel seguente
modo.
Si organizza il repository come segue:
Questa operazione copia il tree attuale /truck/projectA in
/tags/projectA/BETA1_5.
La copia consiste solo nella generazione di un collegamento ("link")
senza duplicare effettivamente i dati.
Poiché il progetto è ancora in una fase iniziale, non è molto usato, promette bene anche
se è un po' lento.
Non re-inventa la ruota ma si poggia su protocolli preesistenti per funzionare.
Tool Commerciali
BitKeeper
BitKeeper è un tool commerciale, ma è possibile scaricarlo e usarlo
"liberamente" seguando un meccanismo di licenza che ha fatto discutere molti.
La sua adozione da parte di Linus Torvald per sviluppare il kernel Linux ha sollevato una polemica[5] nel mondo GNU/Open
Source.
È un tool che può funzionare in modo distribuito, e questo è il suo punto di
forza.
Cerchiamo di descrivere in breve la licenza:
è possibile comperare BitKeeper, oppure usarlo liberamente.
In quest'ultimo caso sono possibili due scelte:
Single User con meno di 1000 file
OpenLogging
La prima opzione forza ad avere un solo utente e limita a meno
di 1000 file il repository. È ovvio che può bastare solo per esigenze
amatoriali.
Questa opzione sicuramente non è stata usata da Linus Torvald.
Con l'OpenLogging invece non ci sono restrizioni di sorta, ma si legge:
[...]
DESCRIPTION
Open Logging is the sending of metadata information to a
centralized, public web server (http://www.openlog-
ging.org), where it is sorted by project, date, and domain
name, and published so that others may follow your
progress.
[...]
WHAT IS SENT?
=> The ChangeSet file (comments and contents).
=> The messages which annotate modifications of the data
(also known as check in comments, ChangeLog entries,
and/or log messages)
=> All files contained in the top level BitKeeper direc-
tory in a BitKeeper repository, in particular the
BitKeeper/html directory and the BitKeeper/etc/config
and BitKeeper/etc/logging_ok files.
WHAT IS NOT SENT?
Your source code or other data managed by BitKeeper.
Read that part again. People frequently think that Open
Logging means publishing their source code, but that isn't
the case.
[...]
Viene esplicitamente detto che la ragione di questo è commerciale,
e che si costringe l'utilizzatore a rinunciare alla sua privacy:
[One] reason is financial. BitKeeper has a dual use
model which allows both commercial and non-paying cus-
tomers to use the same software. Our goal is that the
Open Source community can use BitKeeper by paying a small
amount of privacy but no money, and that commercial cus-
tomers can use BitKeeper by paying money and keeping their
privacy. Open Logging is how this accomplished.
La cosa più grave a nostro avviso è che il sito
http://www.openlogging.org
riporta un errore 404 e non è accessibile.
Cosa viene fatto esattamente di questi dati è impossibile saperlo,
anche perché in America non esiste una legge sulla privacy.
BitKeeper è disponibile per moltissime piattaforme (Unix, Windows, ecc) e
supporta una debole integrazione con la shell di Windows.
Trattandosi di un prodotto commerciale si deve notare che non dispone di tool
visuali molto ben integrati (si serve del Tcl/Tk per funzionare) anche se
alla lunga possono risultare migliori di quelli di Visual Source Safe.
Non ha gli svantaggi di CVS, e sicuramente ne condivide molti dei pregi ma non
è ne' carne ne' pesce: da una parte non si vede la necessità di comperarlo,
perché lo si può usare gratis. Dall'altra gli sviluppatori open source sono
allergici ad usarlo perché sentono violata la loro privacy.
ClearCase
ClearCase è prodotto dalla Rational. Funziona su piattaforma Unix e Windows.
Si tratta di un tool commerciale atto a sviluppare progetti di grandi
dimensioni.
Il codice viene memorizzato in un database (chiamato repository).
Supporta tutte le sue caratteristiche elencate in precedenza per gli altri
tools, e in più dispone di:
Potente motore di regole (ConfigSpec)
Il ConfigSpec specifica, attraverso una serie di regole, quale release
vedere. Per esempio è possibile vedere la versione di un branch per il
sotto albero
src/ottimizzato e l'ultima versione stabile su
src/funzionoNonToccarmi.
Viste Dinamiche Ottimizzate
Le viste dinamiche consentono di far sì che appena lo sviluppatore "Bill"
mette in checkin un file, lo sviluppatore "Steve" può utilizzarlo, se lo
desidera. Questo aumenta la produttività del team e consente rilasci più
rapidi.
Ottimo tool di merge
Il tool di merge automatico di ClearCase è una manna dal cielo quando
si tratta di fondere un branch su un main o viceversa: è possibile
monitorare il suo operato, consentendogli di risolvere "a naso" i
conflitti.
In realtà ClearCase si avvale di un algoritmo ben preciso, che per ragioni
di spazio non esponiamo: questo algoritmo, data la versione base di un
file e due conflitti, sceglie in modo semi-automatico cosa integrare nella
versione di output.
I tool visuali unix sono sensibilmente differenti da quelli per Windows.
In generare l'ambiente visuale di Windows è migliore: ClearCase supporta
nativamente il confronto (diff) di documenti MS-Word e riconosce e gestisce i
tipi di file più comuni (immagini, binari ecc).
Per ospitare il repository un server unix è la scelta più indicata perché è
più stabile e sicuro.
La documentazione è ben fatta e compatta, considerando che il tool è
notevolmente complesso.
ClearCase dispone di una ottima implementazione delle viste dinamiche, che gli
consente di non soffrire in efficienza, purché lo si usi su una LAN ad almeno
10Mbit.
I punti deboli di ClearCase sono sostanzialmente due:
Il costo di acquisto e mantenimento è molto alto
La versione "light" non fornisce le viste dinamiche, che sono una delle
ragioni per cui vale la pena considerare l'uso del prodotto. Il costo delle
licenze è alto e non è fornito un tool di bug tracking in bundle (bisogna
comperare ClearQuest). Infine, come giustamente osservato[4] dalla concorrenza, necessita di almeno una
macchina server dedicata.
Overhead di gestione non nullo
Trattandosi di un prodotto complesso, è necessario pianificare il backup
periodico del repository, e far si che un project manager expert o senior
risolva eventuali malfunzionamenti. Benché si verifichino raramente
problemi, in tali casi è necessario il supporto di una persona con
esperienza.
Si ricordi che l'overhead di gestione c'è anche per tool come CVS, ove
molte feature sono lasciate all'iniziativa personale (per esempio il
logging dei check-in).
Visual Source Safe
Il prodotto della Microsoft non brilla ne' per le feature ne' per il costo.
Dispone di una buon integrazione con i prodotti Microsoft (si fa facilmente
il confronto di documenti Word ecc) ma per esempio non supporta unix.
Un grave difetto è l'assenza del supporto per branch paralleli.
Ciò che può fare è congelare una versione e permettere di partire con un
nuovo "branch", ma non potendo lavorare su entrambi in parallelo. Ovvero, fare
coesistere una "stable" e "developer" release su VSS è praticamente
impossibile.
Si ricorda che tali funzionalità sono supportate anche dal "modesto" e
gratuito CVS.
I tool visuali sono ridotti all'osso e il tool di linea di comando non ha
la stessa potenza degli altri prodotti analizzati.
Generare un report automatico o integrare un tool di bug tracking è
impossibile.
Sicuramente non è stato usato per sviluppare Windows95 (che aveva uno zoccolo
duro di 500 programmatori sparsi per il pianeta).
Conclusioni: cosa scegliere
La scelta di un tool di controllo di revisione dipende da moltissimi fattori.
Infatti per gli sviluppatori è quasi come scegliere un editor: ognuno ha il
suo preferito, ma nel caso di un tool di gestione delle revisioni è
obbligatorio trovarne uno che "vada bene" a tutto il team.
Una volta scelto un prodotto, è bene che esso sia usato per tutti i progetti,
in modo da incoraggiare il riuso e l'integrazione del codice all'interno della
stessa azienda.
In alcuni progetti può esservi la necessità di sincronizzare l'operato di
sviluppatori distanti, disponendo solo di lente connessioni internet (es
Modem/ADSL): in tal caso ClearCase/Visual Source Safe non sono la scelta
ottimale; CVS e BitKeeper si comportano sicuramente meglio.
D'altronde se il progetto ha un team dinamico, per esempio con 8-10
sviluppatori ad alto skill e tempi stretti, giocare al piccolo "merge-man" con
CVS è sconsigliato: ClearCase in quel caso può essere un ottimo investimento.
Volendo fare uno specchietto riassuntivo:
CVS
CVS è usato dal 99% del software GNU Open Source. Questo non toglie
che abbia grossi limiti che impediscono ai "Junior" di apprezzare i
vantaggi dell'uso di un buon tool di revisione.
ClearCase
Se avete esigenze professionali, è da preferire a Visual Source Safe.
BitKeeper
Da preferire a CVS; scelto da Linus Torvald per sviluppare Linux.
Nutriamo tuttavia forti dubbi sulla bontà della licenza, che a nostro
avviso rovina il prodotto.
Informazioni sull'autore
Giovanni Giorgi, classe 1974. Dopo il diploma di liceo Classico, si è laureato in Informatica nel febbraio 2000, e attualmente lavora nel campo del software finanziario (trading on line, soluzioni web). Appassionato di linguaggi di programmazione, si interessa anche di politica e letteratura.
SubVersion è adatto al mio progetto? Pur essendo un software in "alfa"
viene usato per ospiare se stesso ... cioè il repository di SubVersion è
ospitato da SubVersion. A questo link trovate una serie di considerazioni
su tale tool.
http://subversion.tigris.org/project_faq.html#stable
In questa notizia di Slashdot si rimanda a due articoli presentati su
KernelTrap a fine maggio 2002, e che fanno riferimento ad una polemica tra
Eric Raymond (cavaliere del GPL) e Linus riguardo la scelta di BitKeeper
come sistema di controllo di revisione per Linux.
http://developers.slashdot.org/article.pl?sid=02/05/28/1341229&mode=nocomment&tid=106
Il tutorial illustra l'uso di CVS ma è una buona introduzione anche per
chi non sa cosa sia un tool di controllo di revisione e voglia averne
un'idea rapida.
http://www.cvshome.org/docs/manual/cvs_1.html#SEC1
Bugzilla è un tool per la raccolta e la gestione dei bugs. Testato sul
complesso (e quindi tendenzialmente prone ai bachi) Mozilla, si dimostra
flessibile e efficace.
http://www.mozilla.org/projects/bugzilla/