Strumenti di sviluppo: Subversion (SVN)

March 15th, 2007 at 1:30 pm • permalink30 comments

Subversion è uno strumento di sviluppo utile per gestire il lavoro collaborativo di più persone in contemporanea sullo stesso progetto.

Attenzione, non parlo di project management lato organizzativo, si parla proprio di lavoro in termini di operatività pratica: modifica di file, sviluppo e programmazione. Subversion è a sua volta un software, gratuito e multi piattaforma.

Introduzione a Subversion

Chi ha avuto il piacere, ed alcune volte il privilegio, di poter programmare in ambito collaborativo con altri sviluppatori avrà senz’altro toccato con mano uno degli aspetti più complicati di quest’attività: la sincronizzazione delle versioni.

Immaginate la situazione.

Gino e Pino sono due sviluppatori che stanno lavorando allo stesso progetto.
Non è assolutamente raro che Gino e Pino, nonostante si siano coordinati al meglio per portare avanti in contemporanea uno il backend e l’altro il frontend dell’applicativo, si trovino a dover lavorare e modificare nello stesso momento i file di connessione con il database.

Gino scopre un bug e lo corregge immediatamente.
Pino invece, ha appena modificato aggiungendo un nuovo percorso al database… caspita, un file è stato modificato due volte, come fare?

Subversion risolve proprio questo (e molti altri) problemi.
Gino e Pino possono lavorare tranquillamente sullo stesso file e, al termine, inviare al repository le modifiche.
Il sistema si preoccuperà di avvertire l’uno che l’altro ha già inviato delle modifiche allo stesso file per gestire nel modo più corretto il merge delle modifiche.

svn-schema

Glossario Subversion

Nelle prossime righe leggerete diversi termini che potrebbero risultare novità.
Ecco un breve glossario.

SVN o Subversion

SVN è il nome abbreviato di Subversion.

SVN è anche il nome del file eseguibile del programma, richiamato ogni volta che è necessario eseguire un comando.
Ad esempio, per aggiornare la propria working copy è possibile eseguire via shell il comando

svn update

Repository

Con il termine repository si intende l’archivio di dati centralizzato gestito direttamente da Subversion.
Il repository è la copia centralizzata alla quale inviare i file modificati e dalla quale scaricare le versioni più aggiornate dei file.

Working Copy

Se il repository è la copia online centralizzata, la working copy è esattamente l’opposto e rappresenta la copia locale dello sviluppatore.
E’ la versione alla quale l’utente applica le proprie modifiche in locale, per poi inviarle in fase finale al repository.

Revisione

Ogni aggiornamento “inviato” al repository rappresenta una nuova revisione.
Subversion applica ad ogni modifica un numero identificativo incrementale da 1 a infinito.

Ad esempio, se ho scaricato dal repository la versione 15 ed ho aggiornato 3 file, nel momento in cui andrò ad inviare le modifiche nuovamente al repository il risultato finale sarà il commit della versione 16.

Commit ed Update

commit ed update sono i due comandi fondamentali di Subversion.

commit è l’operazione di invio della working copy al repository.
Viceversa, update è la fase di download della versione aggiornata del repository con aggiornamento della propria working copy.

Subversion: logica base del funzionamento

Immaginate un repository di Subversion come un grande magazzino di dati.
Per ora non ci interessa conoscerlo in modo più tecnico e, tra l’altro, non è scopo di questo articolo.

Il funzionamento base del sistema si può riassumere come segue

working copy

Ogni utente ha una copia del repository sul proprio computer (chiamata working copy).

svn-step1

modifica

L’utente esegue le modifiche sulla propria copia locale e, al termine, invia al repository remoto gli aggiornamenti.

svn-step2

invio modifiche

Il repository riceve gli aggiornamenti, aggiorna la copia remota ed assegna un nuovo numero progressivo alla revisione.

update contemporanei

A questo punto, chiunque può disporre della versione aggiornata. Nel caso in cui qualcuno tenti di inviare delle modifiche ad un file appena aggiornato, il repository inverà un messaggio d’avviso.
Attraverso i tool di SVN è possibile gestire quale revisione e quale singola modifica deve essere mantenuta.

svn-step3

In caso di conflitto, è possibile gestire il merge delle revisioni.

svn-step4

svn-step5

Subversion client vs server

Il funzionamento di Subversion si basa sul seguente concetto.

Il repository è uno unico, gestito da una installazione di Subversion Server.
Subversion server ha il compito di organizzare il salvataggio e la gestione completa delle revisioni.

Ogni utente dispone invece di una versione si Subversion Client.
Il client è l’interfaccia al repository. Interpreta tutti i comandi necessari per scaricare una revisione, inviare gli aggiornamenti ed analizzare le modifiche.

Come essere subito operativi con Subversion

Essere subito operativi con Subversion potrebbe non essre così immediato.
E’ necessario disporre di un server che supporti SVN per evitare l’installazione e la configurazione della versione server.
A tal scopo valutate cosa offre il vostro provider. Ad esempio Dreamhost lo integra nei propri piani di hosting.

A questo punto, scaricate il client Subversion per il vostro sistema operativo.
Per evitare di impazzire via shell, esistono poi diverse interfacce grafiche di supporto.
Per Windows consiglio vivamente TortoiseSVN che integrandosi in Explorer fornirà immediatamente i comandi attraverso l’interfaccia di Windows.

tortoise-svn

Per essere certi che SVN sia stato installato sul vostro computer provate a digitare via shell il comando

svn --version

In risposta dovreste ricevere la versione di Subversion installata

svn, versione 1.4.2 (r22196)
compilato Nov 3 2006, 16:53:07

svn-version

Da questo momento siete operativi… vi manca solo un repository su cui lavorare!

Comandi base per il vostro repository Subversion!

Create il vostro repository secondo le istruzioni fornite dal provider.
In seguito potrete gestire la sincronizzazione attraverso i seguenti comandi.

svn checkout

svn-simplepie
Il checkout esegue una copia del repository remoto sul vostro computer, creando una working copy locale.
Immaginate ad esempio di voler scaricare sul vostro computer una copia del repository di Simplepie, localizzata all’indirizzo http://svn.simplepie.org/simplepie/trunk.

Via shell portatevi nella cartella dove volete creare la working copy e digitate il comando

svn checkout http://svn.simplepie.org/simplepie/trunk simplepie

Et voilà il nostro nuovo repository SVN contiene l’ultima revisione di simplepie, nel mio caso la 567.

svn-checkout

La stessa operazione era gestibile anche da TortoiseSVN scegliendo il comando checkout dal menu contestuale.

svn-tortoise-checkout

Nota. In alcuni casi potebbe essere necessario autenticarsi ad un repository.
Non tutti i repository, infatti, sono aperti pubblicamente. Spesso sono protetti da nome utente e password.

svn update

Ogni qual volta volete scaricare la versione aggiornata del repository non è necessario eseguire un checkout.
Il comando update provvederà a verificare la vostra revisione e scaricare solo i file aggiornati dall’ultimo update eseguito.

svn-update

Nel mio caso, il comando

svn update

non ha scaricato alcun file poiché disponevo già dell’ultima revisione.
Anche in questo caso Tortoise permette di gestire tutto direttamente con un click del mouse.

svn commit

Il commit è l’operazione inversa all’update.
Eseguendo un commit della vostra working copy al repository, invierete al server i file modificati.

I file verranno analizzati, le modifiche integrate nel repository e la revisione incrementata di uno.
Per eseguite un commit è necessario disporre dei permessi di scrittura nel repository, associati ad una username e password.

svn-tortoise-commit

Ogni commit può prevedere un messaggio utile per analizzare in seguito i log delle revisioni.
Per eseguire un commit consiglio, soprattutti ai neofiti, di ricorrere a strumenti con interfaccia grafica, come TortoiseSVN, che agevolano notevolmente l’operazione.

Conclusioni

Obiettivo di questo articolo non era fornire la guida definitiva a Subversion, bensì descriverne a grandi linee il funzionamento.

Per approfondimenti è possibile visitare il sito di Subversion, la pagina su Wikipedia o il libro guida gratuito.

In alternativa, state sintonizzati su questo blog! ;)

Filed in Programmazione, Software • Tags: ,


  • Pingback: Come spostare un repository Subversion (SVN) - Simone Carletti’s Blog

  • http://billiejoex.altervista.org billiejoex

    Complimenti per la stesura.
    Per la prima volta, in questi giorni, ho avuto la necessità di avere a che fare con SVN e ho avuto non poche difficoltà anche per capire come eseguire i task più semplici.
    Questa semplice guida mi ha gettato le basi per cominciare ad essere operativo.

    Grazie per il tuo supporto alla comunità.

  • http://alepuzio.splinder.com alepuzio

    Bel post.
    Una curiosità da neofita di Subversion: quando digito da shell e sono nella cartella dove devo lavorare:

    svn update

    mi compare una scritta che mi dice che non sono su una cartella di lavoro.
    Tu sai dirmi qualcosa?

    ciao

  • http://amelix.blogspot.com/ DanKan

    Grande! Non ce la facevo più a leggermi tonnellate di manuali in inglese!
    Infatti avevo avuto dei grossi problemi tentando di installare Apache etc…

  • http://lorello.it Lorello

    Se pensate che SVN sia molto utile per la gestione di documenti, oltre che per lo sviluppo condiviso di codice… siete in buona compagnia: http://www.mindquarry.com

    Ciao e grazie del tutorial :-)

  • Pingback: Strumenti di sviluppo: Issue Tracker - Simone Carletti’s Blog

  • http://www.centrostudilaruna.it/huginnemuninn/ Alberto

    Questo articolo mi è stato utilissimo. In passato non avevo compreso, infatti, la necessità di scaricare il pacchetto lato client: immaginavo subversion operasse semplicemente sul server su cui è installato e che i trasferimenti operassero via ftp. Lo sviluppo di wordpress è ora basato su SVN.

  • Pingback: Strumenti di sviluppo: Bugzilla - Simone Carletti’s Blog

  • Luca

    Ho un problema con il Subversion!In pratica a casa ho un server ftp a cui si connettono dei miei amici, ho avuto la necessità di installare Subversion perkè dobbiamo programmare e abbiamo bisogno di sincronizzare il lavoro.
    Ho seguito la guida sopra elencata e tutto m funziona alla perfezione.
    L’unico problema è quando da un pc che nn è il server tipo il mio o quello di un mio amico vogliamo fare il “svn checkout” e quindi aggiornarci alla versione del server m salta fuori l’errore “Can’t connect to host ‘indirizzo’:Impossibile stabilire la connessione.Rifiuto persistente del computer di destinazione” m è subito saltata l’idea che il firewall impedisse l’accesso quindi l’ho disattivato e aperto la porta 3690 però l’errore rimane cosa devo fare?Vi prego di aiutarmi è importante!!!!
    Grazie 1000 a tutti!!!

  • http://www.canale43tv.com diego

    grazie ottimo tutorial!!!
    ho risolto molti problemi

  • stefano

    Scusate ho un problema con zend praticamente non mi aggiorna i file con il commit sul repository mentre l’update riesce bene

  • http://www.simonecarletti.it Simone Carletti

    @ stefano

    Le informazioni che hai fornito sono un po’ vaghe.
    Puoi essere più preciso?

  • marco

    Ciao,

    complimenti per l’articolo.
    Volevo sapere se era obbligatorio strutturare il mio progetto con i direttori di trunk, branches e tags o se una volta creato un repository, posso copiare direttamente i direttori di lavoro.
    grazie

    marco

  • http://www.simonecarletti.it Simone Carletti

    Marco,
    creare lo skeleton convenzionale non è obbligatorio.

    Tuttavia potresti poi scontrarti in futuro con diversi problemi, soprattutto nel caso in cui utilizzi strumenti per interagire con SVN che si affidano alla struttura di directory convenzionale.

    Ti consiglio di creare la struttura a 3 rami così come suggerito. :)

  • Pingback: Libro Ship it! A Practical Guide to Successful Software Projects - Simone Carletti’s Blog

  • http://saverio.bolognani.googlepages.com/ Saverio Bolognani

    Grazie per la guida, è stata una delle fonti che ho letto quando ho cominciato ad avvicinarmi a svn (in particolare per la stesura di articoli in gruppo).

    Non hai scritto come gestire i conflitti, a parte il caso più semplice in cui il client SVN fa il merge automaticamente. Capita qualche volta che due utenti facciano modifiche allo stesso file e non riescano quindi a fare il commit entrambi. La procedura base che deve seguire il secondo utente per poter fare il merge a mano l’ho scritta su

    http://saverio.bolognani.googlepages.com/svn

    È una paginetta brevissima, serviva solo per dire i comandi chiave ai miei colleghi con cui collaboro (digiuni di svn). Spero possa esservi di aiuto! :-)

  • dilog

    complimenti, articolo molto chiaro! grazie!

  • Stefano

    Volevo ringraziarti per gli articoli scritti, ho avuto modo di leggere bugzilla, deskzilla e svn;

    In merito a quest’ultimo volevo chiedere se esistono software possibilmente free per itnerrogarae il log di svn.

    Grazie
    stefano.

  • http://www.simonecarletti.it Simone Carletti

    Ciao Stefano,
    sì, esistono numerosi software sia desktop sia web.

    Se usi Windows allora TortoiseSVN è senz’altro un eccellente prodotto.
    In alternativa, la versione free di SmartSVN può fare al caso tuo. E’ scritto in Java ed è multipiattaforma.

  • Pingback: Libro Pragmatic Version Control Using Git - Simone Carletti’s Blog

  • Davide

    Buongiorno volevo sapere se è possibile ottenere una sorta di list del repository. Ovvero il comando svn list prende come parametro la working copy. Volevo sapere se esiste il modo per listare i file utilizzando la cartella del repository

    Grazie

    Davide

    • http://www.simonecarletti.it/ Simone Carletti

      Basta specificare il percorso completo del repository.

      svn info svn://indirizzo/del/repository/trunk

  • Massimo Garavaglia

    Salve,
    ho un problema con TortoiseSVN cui non ho trovato soluzione ne sul manuale ne sul sito. Chissa se qualcuno mi puo’ aiutare.
    Il problema e’ il seguente: come fare un undo di un commit? un collega ha fatto un commit per errore ed ora la head revision contiene dei files vecchi. La mia working copy e’ OK ed io vorrei semplicemente cancellare la head revision sbagliata oppure sovrascriverci sopra la mia working copy. Ho timore a fare un commit della mia copia, perche’ credo che SVN tenti di fare dei merge, mentre il mio intento e’ quello di “piallare” tutto. Come faccio?
    Grazie.

    Massimo

    • http://www.simonecarletti.it/ Simone Carletti

      Non esiste l’undo in SVN. L’unica è eseguire un reverse merge del commit.

      • Massimo Garavaglia

        Grazie mille: ha funzionato.

        Massimo

  • http://www.mauroesposito.it Mauro

    Ciao!
    Complimenti, davvero un bel tutorial!
    Come guida introduttiva è anche molto deep!!

    Mauro

  • Adriano

    Ciao a tutti ho un problema con svn. Quando faccio il checkout dal mio pc che non è server mi da “rifiuto persistente del computer di destinazione”. Abbiamo provato a disattivare tutti i firewall ma nulla non va. Sapete aiutarmi?

  • Giorgio

    Chiaro e conciso, quello che ci voleva per usare per la prima volta subversion.
    Grazie.

  • http://www.braintrekking.wordpress.com carlo

    Ciao, complimenti per la spiegazione, devo preparare delle slides esemplificative di subversion per un numero ristretto di persone che sono a secco dei suoi concetti ed ho trovato il tuo modo di illustrarlo molto chiaro e conciso. Vai subito al sodo, non è dote da poco.

  • Daniele

    Complimenti Simone!
    Grazie per aver condiviso il tuo lavoro e la tua pazienza nell’aver creato tutto ciò.

    Non ho ancora finito di leggerlo, ma già dall’inizio è semplicemente perfetto per chi deve, come me, iniziare a lavorare con SVN.

    Grazie ancora.
    Daniele

Follow Me
    Random Quote