Nelle prime lezioni abbiamo introdotto il modello di versionamento Copy-Modify-Merge e abbiamo visto come questo non possa essere indistintamente applicato a tutti i file. In particolare la fusione di diverse modifiche non è disponibile per i file non-mergeable (immagini, o file binari).
In questi casi la realizzazione contemporanea di modifiche da parte di diversi utenti non è un'opzione accettabile, perciò dobbiamo ricorrere all'aiuto dell comando lock
.
svn lock filename -m "messaggio"
Il comando stabilisce che un utente abbia l'esclusiva sulla modifica del file, bloccando tutti gli altri. Subversion non interpreta il lock in maniera particolarmente rigida. Infatti, qualunque utente (non solo l'amministratore) che abbia accesso in modifica al repository può rimuovere i lock altrui, o "rubarli" (si dice "rubare un lock" quando con la medesima operazione si toglie un lock altrui e se ne mette un proprio, senza lasciare un intervallo in cui qualcuno altro possa bloccare il file).
In TortoiseSVN, si usa l'opzione Get Lock
disponibile cliccando con il tasto destro sul file che si vuole bloccare.
L'idea di Subversion è che il blocco sia uno strumento di comunicazione più che di protezione: deve avvisare gli altri utenti che stiamo effettuando modifiche esclusive, ma si suppone che un collaboratore possa avere buoni motivi per rompere il lock e proseguire con le modifiche, e quindi glielo si lascia fare.
Tecnicamente non viene effettuata nessuna modifica al file: il lock viene creato come file separato in una apposita cartella del repository, come vedremo più avanti quando ci occuperemo dell'amministrazione del repository.
Parliamoci... e usiamo Subversion
Il concetto di implementazione dei lock
è un esempio abbastanza chiaro dello spirito che ha spinto i progettisti di Subversion a effettuare le proprie scelte.
Nella guida ufficiale è espresso chiaramente come Subversion non possa sostituire il dialogo, la corretta pianificazione dei lavori e gli standard di nomenclatura. Ad esempio non può impedire che due programmatori diversi definiscano due funzioni con lo stesso nome in due parti diverse del file, una all'inzio e una alla fine: per il nostro server le modifiche non si sovrappongono e quindi va bene così.
Questo però non riduce l'utilità di Subversion. Anzi, il programma riesce in vari modi a migliorare la nostra cooperazione, soprattutto se siamo un team disorganizzato:
- blocca le sovrapposizioni più evidenti (modifiche diverse alle stesse righe di codice);
- aiuta a scoprire rapidamente dove sono tali sovrapposizioni e a risolverle;
- permette facilmente e rapidamente di "fare ordine" in eventuali sovrapposizioni, tornando a versioni precedenti, annullando le modifiche locali, o confrontando varie revisioni dei file.
Quindi, Subversion non sostituisce una efficente organizzazione interna, ma è uno strumento che ci aiuta a implementarla e mantenerla.