Appunti per l`uso di Bazaar
Transcript
Appunti per l`uso di Bazaar
Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 autori: luciano de falco alfano Sommario Sommario......................................................................................................................................................1 Introduzione: i VCS......................................................................................................................................1 A cosa servono......................................................................................................................2 Come si utilizzano..................................................................................................................2 Concetti generali..........................................................................................................................................3 Installazione..................................................................................................................................................4 I principali comandi......................................................................................................................................4 Aiuto (help).............................................................................................................................4 Identificazione (whoami)........................................................................................................5 Inizializzazione (init-repo, init).............................................................................................5 Gestione dei file (add, remove).............................................................................................6 Controllo della revisione (commit, uncommit, revert, info, log, status, diff)......................7 Inizializzazione, operazioni avanzate (branch, checkout, merge, resolve)..........................9 Riassumendo........................................................................................................................12 Lavorare in modalità centralizzata (lockstep)...........................................................................................13 Creazione di un repository centrale condiviso (init-repo)................................................13 Creazione di un branch centrale e suo popolamento (init, push, pull, checkout, bind, unbind)..................................................................................................................................14 Lavorare con i checkout (update, commit, commit --local, bind, unbind)........................16 Cenni per lavorare in modalità distribuita.................................................................................................19 Inserimento di una nuova funzione nel trunk senza amministratore.................................20 Inserimento di una nuova funzione nel trunk con amministratore.....................................20 Appendici....................................................................................................................................................21 Gestione del “warning some compiled extensions could not be loaded”..........................21 Utenza e password per il “file schema” in Windows non funzionano...............................21 Riferimenti..................................................................................................................................................21 Acronimi e abbreviazioni...........................................................................................................................22 Identificazione e storia del documento.....................................................................................................22 Queste note illustrano alcuni concetti generali relativi all'uso dei sistemi di versioning, e le operazioni di base per l'utilizzo di uno di essi: Bazaar. Per maggiori informazioni documentazione relativa a letteratura su Internet. riguardo questi argomenti si può utilizzare la Bazaar (rif.[3] a pag.21) o consultare l'estesa Introduzione: i VCS Bazaar appartiene alla famiglia di programmi noti come Version Control Systems (VCS). I VCS sono anche detti: Revision control systems, source control systems, o Fname: bazaar_note-1.1 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 software configuration management (SCM) systems. Oltre Bazaar, altri noti esponenti dei VCS sono Concurrent Version System (CVS) e Apache Subversion (SVN). Ma sono solo alcuni esempi: di VCS ne esistono veramente una pletora. A cosa servono A che serve un VCS? Il suo scopo consiste nel permettere di memorizzare in un determinato istante lo stato di un insieme di file. E di poter ottenere in un momento successivo il gruppo di file che formano uno degli stati salvati. E' una sorta di undo, ma con due prerogative: • lavora con gruppi di file invece di un file singolo; • è possibile ottenere non solo l'ultimo gruppo di file salvati, ma anche un qualunque gruppo precedente. In questo modo, ad esempio, è possibile: • buttare tutto e ricominciare da capo se si sono fatti errori estesi nella stesura di più file che formano il gruppo di documenti di un progetto; • clonare un progetto in sviluppo, effettuare delle modifiche per studiare un determinato concetto, e successivamente decidere se inglobarle nel progetto originale; • clonare un progetto in sviluppo tante volte quanti sono i programmatori incaricati, e successivamente riportare gli sviluppi effettuati autonomamente da ciascuno di loro nel progetto di riferimento. Questi sono solo alcuni esempi di utilizzo. Come si utilizzano E' facile definire cosa fa un VCS. Ma le modalità di utilizzo possono essere molto diverse. I VCS possono essere utilizzati da una sola persona. Ad esempio per tenere la storia di una documentazione complessa, formata da più sorgenti (disegni, tabelle e altre componenti assemblate in un documento faldone). Oppure possono essere utilizzati da gruppi di programmatori, magari posti in sedi molto distanti fra loro, che devono collaborare a uno stesso progetto di sviluppo software. Bazaar a questo riguardo è molto flessibile. Permette di adottare sia i due modelli di lavoro predetti, che altri casi intermedi. Questa flessibilità di Bazaar introduce un elemento di complessità da tenere sotto controllo. Pag. 2 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 Concetti generali Per utilizzare Bazaar (e altri sistemi VCS) è necessario avere ben presenti i seguenti punti. • Revision, o revisione. E' una istantanea dei file su cui si sta lavorando. E' possibile ottenere una copia dell'insieme dei file che formano una revisione. • Working tree, o albero di lavoro. E' la directory in cui sono i file e le subdirectory sotto controllo da parte di Bazaar. • Branch, o ramo, o linea di sviluppo. E' la storia delle revisioni che formano l'evoluzione dei file su cui si lavora. Quindi un insieme (temporalmente) ordinato di revisioni. Un progetto può avere linee di sviluppo parallele. Quando questo accade, linee di sviluppo con un antenato comune sono dette related branches. Quando una linea di sviluppo confluisce in un'altra, si applicano i cambiamenti della prima alla seconda. Questo tipo di operazione è detta merge. • Repository è un magazzino di revisioni. e Branch sono associati 1:1. Deve esistere 1 un Working tree per un determinato branch , e viceversa. Working Tree Un esempio di evoluzione di un gruppo di file è rappresentato nella figura a fianco, ripresa da wikipedia . Nella figura, i quadrati numerati sono revisioni. I nodi verdi rappresentano la linea di sviluppo principale. Quelli arancioni sono le copie di lavoro, che poi saranno fatte confluire nella linea di sviluppo principale con operazioni di fusione (merge). Quando si lavora con un VCS, di solito si ha a che fare con questi tipi di operazioni: Illustrazione 1: Esempio di evoluzione di un gruppo di file (da Wikipedia) • inizializzazione di un repository con un dato progetto; • estrazione di una propria copia di lavoro del progetto dal repository; • effettuare il lavoro sulla propria copia, eventualmente fissando delle revisioni; si noti che in questa fase, oltre modificare, è possibile aggiungere/togliere file/directory dal progetto; • far confluire il lavoro effettuato dalla propria copia alla linea di sviluppo di riferimento nel 1 In questo ambito, Bazaar ammette eccezioni, come spiegato successivamente a pag.5. Pag. 3 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 repository. Questo processo di lavorazione è valido anche per Bazaar. Un punto cui fare attenzione è il concetto di repository. Con Bazaar è possibile fare a meno del repository, e lavorare direttamente utilizzando il solo concetto di branch. Ma un repository, soprattutto se condiviso tra i branch 2 , permette una flessibilità (e complessità) nettamente superiore. Installazione Dal sito , effettuare il download della versione 2.1.1 che si basa su python 2.6 (file bzr-2.1.1.win32-py2.6.exe ). Installazione standard. Check: bzr --version Bazaar (bzr) 2.1.1 Python interpreter: C:\Programmi\Python26\python.exe 2.6.2 Python standard library: C:\Programmi\Python26\lib Platform: Windows-XP-5.1.2600-SP3 bzrlib: C:\Programmi\Python26\lib\site-packages\bzrlib ... I principali comandi In questo capitolo vediamo i principali comandi di Bazaar. Per la cronaca: sono meno di 20. Aiuto (help) Il comando principale è help . Quando si conoscono i principi di base, l'uso dell'help spesso risolve eventuali dubbi. Il solo help elenca i comandi conosciuti da Bazaar. E' possibile richiedere help comando per avere la descrizione sintetica del comando cercato. Esempi di uso di help Elenco dei comandi disponibili: bzr help Bazaar 2.1.1 -- a free distributed version-control tool http://bazaar-vcs.org/ Basic commands: bzr init bzr branch bzr add bzr ignore bzr mv makes this directory a versioned branch make a copy of another branch make files or directories versioned ignore a file or pattern move or rename a versioned file 2 Rimarchiamo il concetto. In Bazaar, per condiviso, si intende tra branch; non tra utenti. Pag. 4 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 bzr status bzr diff summarize changes in working copy show detailed diffs bzr merge bzr commit bzr send pull in changes from another branch save some or all changes send changes via email bzr log bzr check show history of changes validate storage bzr help init bzr help commands bzr help topics more help on e.g. init command list all commands list all help topics Help relativo ad un singolo comando, ad es. add (si veda oltre): bzr help add Purpose: Add specified files or directories. Usage: bzr add [FILE...] Options: --dry-run -v, --verbose --file-ids-from=ARG --no-recurse -q, --quiet --usage -h, --help Show what would be done, but don't actually do anything. Display more information. Lookup file ids from this tree. Don't recursively add the contents of directories. Only display errors and warnings. Show usage message and options. Show help message. Description: In non-recursive mode, all the named items are added, regardless of whether they were previously ignored. A warning is given if any of the named files are already versioned. ... Identificazione (whoami) Con i sistemi di versioning è necessario identificarsi. Con Bazaar si usa il comando whoami . Ad esempio: bzr whoami "user <casella-postale@dominio>" definisce l'utente user con email casella-postale@dominio . Virgolette e parentesi acute vanno usate letteralmente. L'identificazione deve essere effettuata una volta sola. Non è una login per una singola sessione di lavoro. Inizializzazione (init-repo, init) Abbiamo: • init-repository , o init-repo , inizializza un repository vuoto su una directory; • init , inizializza un branch vuoto su una directory. Se esiste un repository condiviso tra più branch, deve essere posizionato nella directory padre dei working-tree dei diversi branch. Quando si usa la init su una directory, se nella directory padre vi è un repository, la storia del branch e relative revisioni sono registrate nel repository. In caso contrario, Bazaar registra la storia e le revisioni stesse nel DB del branch. Pag. 5 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 Il comando init-repo ha l'opzione --no-trees per creare un repository i cui branch sono di default senza working-tree. Ovvero esistono come directory, ma non hanno una copia locale del codice. Questo è utile per i repository centralizzati. Permette di creare branch i cui working tree sono remoti, localizzati sui computer degli sviluppatori. Esempio: creazione di un repository locale Supponiamo di avere questa struttura locale: C:/.../sviluppo +---- sito +--- files del sito: html e css Dove sito è la directory di lavoro corrente per lo sviluppo di un sito. Vogliamo mettere il progetto sotto controllo di versione. Per farlo, prevediamo un repository condiviso (directory .../sviluppo/repo ), e sotto questo le directory per i branch. In particolare per il main branch, che chiamiamo .../sviluppo/repo/sito . Alla fine avremo: C:\...\sviluppo +--- sito # dir.di lavoro corrente | +--- files del sito: html e css +--- repo # dir.del repository +--- sito # dir.del main branch Questa struttura può essere creata con i comandi (1). . . .cd .../sviluppo bzr init-repo repo Shared repository with trees (format: 2a) Location: shared repository: repo cd repo bzr init sito Created a repository tree (format: 2a) Using shared repository: C:/.../sviluppo/repo/ In questo caso il repository nella directory .../sviluppo/repo conterrà la storia di .../sviluppo/repo/sito . Così come le varie revisioni create. Se si vuole creare un branch vuoto parallelo in .../sviluppo/repo/sito-b1 , basta eseguire: cd .../sviluppo/repo bzr init sito-b1 Gestione dei file (add, remove) Con repository e branch vuoti ci si fa poco. A questo punto dobbiamo gestire il contenuto di una revision, nonché la sua creazione. Per la creazione si veda il paragrafo successivo (controllo della versione). Per la gestione dei file abbiamo i seguenti comandi. • add , registra file/directory da incamerare alla prossima revisione. • remove --keep , deregistra file/directory dalla revisione. Attenzione: questo Pag. 6 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 comando è pericoloso. Senza l'opzione –-keep , non solo rimuove il file dal DB di Bazaar, ma anche dal disco su cui si sta lavorando. Esempio: registrare file in un repository locale Supponiamo di avere creato il repository locale dell'esempio (1) (pag.6). Vogliamo aggiungere al progetto i file che abbiamo gestito in .../sviluppi/sito . Per farlo li copiamo nella directory .../sviluppi/repo/sito e poi li registriamo per la prossima revision: (3). . . .cd .../sviluppi/repo/sito copy ../../sito/*.* . ..\..\sito\index.html ..\..\sito\page_1.html ..\..\sito\page_2.html ..\..\sito\test.css 4 file copiati. bzr add adding index.html adding page_1.html adding page_2.html adding test.css La copy porta nella directory corrente (che è la linea di sviluppo principale) i file che stavamo precedentemente editando. Il comando add senza ulteriori parametri indica a Bazaar di aggiungere al controllo di versione tutti i file e sottodirectory che trovano nella directory corrente. Controllo della revisione (commit, uncommit, revert, info, log, status, diff) A questo punto dobbiamo gestire la versione (revision), con i seguenti comandi. • commit , crea la revisione; • uncommit , rimuove l'ultima revisione; • revert , riporta i file del branch corrente all'ultima revisione salvata; • • info , visualizza le informazioni working tree, repository o branch; (localizzazioni e formati) riguardanti log , elenca le revisioni presenti nel branch; • status , elenca revisione; i file correnti modificati/aggiunti/rimossi rispetto la • diff , individua le differenze tra i file correnti e quelli che formano l'ultima revisione. Esempio: creare una revisione, editing errato dei sorgenti, ripristino dei sorgenti Supponiamo di avere preparato l'ambiente dell'esempio (3) (pag.7). Siamo pronti per creare una revisione: (4). . . .cd .../sviluppi/repo/sito bzr commit -m "primo snapshot" Committing to: C:/.../sviluppo/repo/sito/ added index.html Pag. 7 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 added page_1.html added page_2.html added test.css Committed revision 1. L'opzione -m (message) di commit , serve per commentare lo snapshot. Se si modificano i file di progetto, usando nuovamente il comando commit si creerà un secondo snapshot. E così via. La situazione del repository, dopo la commit sarà la seguente: bzr log -----------------------------------------------------------revno: 1 committer: ldfa <[email protected]> branch nick: sito timestamp: Tue 2010-05-04 19:39:59 +0200 message: primo snapshot Ipotizziamo di modificare pesantemente il codice, e di realizzare di avere fatto errori diffusi non accettabili. Controlliamo con uno status : bzr status removed: page_2.html modified: index.html page_1.html Osserviamo un file rimosso, e altri due modificati. Modificati come? Facciamo diff. >bzr diff === modified file 'index.html' --- index.html 2010-05-04 17:39:59 +0000 +++ index.html 2010-05-04 22:33:37 +0000 @@ -1,11 +1,10 @@ <html> <link rel="stylesheet" type="text/css" href="./test.css"> <body><h1>Home</h1> <p>Welcome home</p> + <p> home</p> <p>You have a lot of possibilities here:</p> <ul> <li><a href="./page_1.html">page_1 is here</a></p> <li><a href="./page_1.html">and page_2 here</a></p> </ul> </body> </html> === modified file 'page_1.html' --- page_1.html 2010-05-04 17:39:59 +0000 +++ page_1.html 2010-05-04 22:34:17 +0000 @@ -1,5 +1,4 @@ <html> <body><h1>WEB site page 1</h1> <p><a href="./index.html">Home is here</a></p> </body> </html> === removed file 'page_2.html' --- page_2.html 2010-05-04 17:39:59 +0000 +++ page_2.html 1970-01-01 00:00:00 +0000 @@ -1,5 +0,0 @@ -<html> <body><h1>WEB site page 2/h1> <p><a href="./index.html">Home is here</a></p> Pag. 8 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 </body> -</html> Nel nuovo sito abbiamo perso il link alla home; la pagina rimossa la vogliamo di nuovo. Ferma tutto: facciamo un restore dell'ultima revisione salvata. bzr M M N bzr revert index.html page_1.html page_2.html status come si vede index.html e page_1.html vengono modificati; page_2.html è nuovo. Il successivo controllo di stato è vuoto: nessuna differenza rispetto l'ultima revisione. Inizializzazione, operazioni avanzate (branch, checkout, merge, resolve) Esistono altre due possibilità di inizializzazione da tenere ben presenti: • branch , crea una copia completa (inclusa la storia) di un branch; le due copie sono indipendenti: una commit nella nuova copia non crea una revisione nel branch sorgente; • checkout , crea una copia di lavoro di un branch esistente; le due copie sono legate: una commit nella copia di lavoro crea l'analoga revisione anche nel branch da cui si proviene. Quando si creano copie di un working tree è perché si ha la necessità di lavorare in parallelo, cercando di non aggrovigliare le modifiche effettuate per motivi diversi. In questi casi, prima o poi, sarà necessario far confluire le modifiche effettuate in un branch destinazione su quello di origine. A questo scopo si usa: • merge , permette di far confluire le modifiche effettuate in un branch, su un altro branch; lavora con sorgenti che sono stati sottoposti a commit ; • update , effettua un allineamento dei sorgenti del branch corrente (tipicamente: un branch destinazione) a partire dal branch sorgente 3 ; • resolve , per indicare a Bazaar che si sono risolti dei conflitti generati a seguito di attività di merge / update. Quando si fanno dei merge, può essere necessario gestire conflitti tra file analoghi. Bazaar usa un criterio di merge intuitivo: un file modificato in uno solo dei due branch è valido , invece un file modificato in entrambi i branch è un conflitto da risolvere. Per darci modo di analizzare la situazione, Bazaar crea tre nuovi file per ogni singolo file in conflitto: • nomefile .BASE , file della revisione precedente; • nomefile .OTHER , file proveniente dal branch che si vuole inglobare; • nomefile .THIS , il file bel branch corrente. Inoltre in nomefile abbiamo la segnalazione di aggiunte nell'albero del branch 3 Il comando update è analogo al comando branch, ma tipicamente viene effettuato per mantenere l'ambiente di lavoro corrente aggiornato rispetto una linea di sviluppo principale. Pag. 9 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 ( <<<<<<< TREE ) e di aggiunte richieste dal merge ( >>>>>>> MERGE-SOURCE ). I conflitti così segnalati andranno risolti manualmente in nomefile , senza toccare i file .BASE , .OTHER e .THIS . Dopo di che il comando resolve provvede alla loro eliminazione e a spegnere il segnale di conflitto in corso. Esempio: creazione di un branch di test, modifica e successivo merge Supponiamo di avere pronto il main branch dell'esempio (4) (pag.7). Per fare dei test d'uso dei css vogliamo farne una copia per evitare di farci editing sopra: cd ...\sviluppi\repo bzr branch sito test-css Branched 1 revision(s). Nella directory test-css modifichiamo il css, creiamo la nuova revisione e poi controlliamo la storia di questo branch e di quello da cui veniamo: cd test-css ... modifica del css ... bzr commit -m "h1 nero su rosso" Committing to: C:/.../sviluppo/repo/test-css/ modified test.css Committed revision 2. (5). . . .bzr log -----------------------------------------------------------revno: 2 committer: luciano <luciano@pc-marco-home> branch nick: test-css timestamp: Wed 2010-05-05 01:11:33 +0200 message: h1 nero su rosso -----------------------------------------------------------revno: 1 committer: ldfa <[email protected]> branch nick: sito timestamp: Tue 2010-05-04 19:39:59 +0200 message: primo snapshot cd ..\sito (6). . . .bzr log -----------------------------------------------------------revno: 1 committer: ldfa <[email protected]> branch nick: sito timestamp: Tue 2010-05-04 19:39:59 +0200 message: primo snapshot Un confronto tra i risultati dei comandi di log ai precedenti punti (5) e (6) permette di osservare che in test-css ora abbiamo 2 revisioni, mentre la sorgente sito ha una sola revisione. Diciamo che le modifiche effettuate nel branch test-css ci piacciono; le vogliamo inglobare nel main branch sito . Visto che abbiamo appena effettuato una commit di test-css possiamo proseguire con il merge: cd ...\repo\sito bzr merge ../test-css M test.css All changes applied successfully. Da notare che il merge non ha creato una nuova revisione in sito . E' sempre necessario provare adeguatamente il nuovo codice prima di fare commit ! Per Pag. 10 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 questo il commit deve esse chiamato esplicitamente in un secondo momento. bzr log -----------------------------------------------------------revno: 1 committer: ldfa <[email protected]> branch nick: sito timestamp: Tue 2010-05-04 19:39:59 +0200 message: primo snapshot Come si vede siamo ancora a revisione 1. Facciamo i nostri controlli, e poi eseguiamo commit . Ora andremo alla revisione 2. (7). . . .bzr commit -m "merged h1 nero su rosso" Committing to: C:/.../sviluppo/repo/sito/ modified test.css Committed revision 2. Esempio: un merge con conflitto Proseguendo l'esempio (7) (pag.11), abbiamo questa situazione iniziale: cd .../sviluppo/repo/sito bzr status bzr info Repository tree (format: 2a) Location: shared repository: C:/.../sviluppo/repo repository branch: . Related branches: submit branch: C:/.../sviluppo/repo/test-css Modifichiamo test.css sia su test-css che su sito , inoltre facciamo commit nei due ambienti: cd .../repo/test-css ... modifiche a test.css e ../sito/test.css ... bzr commit -m "h3 nero su rosso" Committing to: C:/.../sviluppo/repo/test-css/ modified test.css Committed revision 3. cd .../repo/sito bzr commit -m "h2 nero su rosso" Committing to: C:/.../sviluppo/repo/sito/ modified test.css Committed revision 3. Fin qui non ci sono problemi: i due branch sono del tutto indipendenti. Ora facciamo il merge di test-css su sito : bzr merge ../test-css M test.css Text conflict in test.css 1 conflicts encountered. bzr status modified: test.css unknown: test.css.BASE test.css.OTHER test.css.THIS conflicts: Text conflict in test.css pending merge tips: (use -v to see all merge revisions) ldfa 2010-05-05 h3 nero su rosso Abbiamo un conflitto in test.css . Pag. 11 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 Come detto, per darci tutte le informazioni necessarie all'analisi del conflitto, Bazaar crea tre nuovi file: • test.css.BASE , file della revisione precedente; • t est.css.OTHER , file proveniente dal branch che si vuole inglobare; • test.css.THIS , il file bel branch corrente. Inoltre in test.css Bazaar segnala le aggiunte nell'albero del branch ( <<<<<<< TREE ) e le aggiunte richieste dal merge ( >>>>>>> MERGE-SOURCE ): type test.css h1 {color: black; background:red} <<<<<<< TREE h2 {color: black; background:red} ======= h3 {color: black; background:red} >>>>>>> MERGE-SOURCE Editiamo il file per inglobare entrambe le modifiche, quindi indichiamo a Bazaar che il conflitto è risolto, controlliamo lo stato e facciamo commit : type test.css h1 {color: black; background:red} h2 {color: black; background:red} h3 {color: black; background:red} bzr resolve –-all bzr status modified: test.css pending merge tips: (use -v to see all merge revisions) ldfa 2010-05-05 h3 nero su rosso bzr commit -m "h1&2&3 nero su rosso" Committing to: C:/.../sviluppo/repo/sito/ modified test.css Committed revision 4. Riassumendo In sintesi, Bazaar mette a disposizione le seguenti funzioni: • whoami per identificarsi, da usare una sola volta; • init-repo e init per creare shared repository e branch vuoti; • add , remove --keep per registrare/deregistrare file e directory; • commit , uncommit per creare/cancellare revisioni; • revert , per ripristinare i sorgenti ad una certa revisione; • info , log , status , diff per controllare la situazione dei sorgenti rispetto le revisioni; • branch , merge , resolve per copiare un branch esistente creandone uno nuovo, per portare le modifiche operate in un branch su un altro, per abbattere la segnalazione di conflitti risolti; • checkout per creare una copia di lavoro da un branch esistente, i due branch sono legati (la commit su uno lavora anche sull'altro). Esistono altri comandi che possono essere utili. Ad esempio la possibilità di Pag. 12 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 assegnare etichette a una revisione (comando tag ). O la possibilità di estrarre un package, ovvero tutti i sorgenti di un progetto inseriti in un archivio (comando export ). Per gli approfondimenti del caso riguardi i comandi illustrati e gli altri disponibili si rimanda alla documentazione di utente (rif.[5] a pag.21). Lavorare in modalità centralizzata (lockstep) Ora che abbiamo visto il set di comandi base di Bazaar, fissiamo le linee guida da seguire per un suo uso come sistema di gestione di un repository centrale. In questo capitolo descriviamo il lavoro in modalità centralizzata; in letteratura: lockstep . In questo caso tutti i programmatori hanno una copia di lavoro del software, ma ogni commit avviene verso un repository centrale. Una commit non avviene se vi sono conflitti (analoghi a quanto descritto nel capitolo Esempio: un merge con conflitto a pag.11). Questo comportamento costringe chi programma a mantenere continuamente allineata la propria copia di lavoro e risolvere i conflitti per effettuare la commit. In generale le attività saranno: • creazione di un repository centrale condiviso; • caricamento dei sorgenti nel repository centrale; • collegamento dei branch locali; • upgrade e commit delle attività locali. Creazione di un repository centrale condiviso (init-repo) Sappiamo che un repository vuoto si crea con il comando init-repo . Nel caso di repository centrali condivisi, di solito si usa init-repo --no-trees per evitare di duplicare sul server dei working trees che in realtà hanno senso solo in periferia. In questi casi si deve usare il comando checkout per legare il working tree periferico a quello “dummy” centrale sul server. Esempio: creazione di un repository condiviso e centralizzato Supponiamo di voler creare un repository condiviso e centralizzato nel server all'IP 10.10.7.249, che condivide la directory //10.10.7.249/Repository/ 4 . Il repository che noi vogliamo creare sarà nella directory //10.10.7.249/Repository/sviluppi . (2). . . .bzr init-repo --no-trees file://10.10.7.249/Repository/sviluppi Shared repository (format: 2a) 4 Non ci si faccia confondere dal fatto che il nome (Repository) della directory condivisa di //10.10.7.249 coincide con il concetto di repository di Bazaar. E' solo un caso di omonimia. Pag. 13 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 Location: shared repository: //10.10.7.249/Repository/sviluppi Creazione di un branch centrale e suo popolamento (init, push, pull, checkout, bind, unbind) Esistono due diversi modi per concettualmente ai seguenti casi. fare questa operazione, e corrispondono • Esiste il nucleo di un progetto ed è sotto controllo di versione in un singolo sistema locale. Lo vogliamo portare su un sistema centrale per poi poterlo gestire con più addetti. In questo caso si crea un branch centrale vuoto (comando init ), poi si copia il branch locale su quello centrale (comando push ). • Il nucleo di un progetto non è sotto controllo di versione. Lo vogliamo portare sotto controllo di versione su un sistema centrale. In questo caso si crea un branch centrale vuoto (comando init ). Poi si crea un checkout locale vuoto del branch predetto 5 . Si copiano i sorgenti nel checkout locale e si fa commit localmente. La revisione appena creata viene copiata anche sul repository centrale. Si usano i comandi: • init , crea branch vuoto (già visto in Inizializzazione (init-repo, init) a pag.5); • push , allinea il contenuto di un mirror (di solito centrale) del branch corrente (di solito locale); i due branch non sono collegati da checkut; • pull , fa in modo che il branch corrente (di solito locale) divenga il mirror di un altro branch (di solito centrale); i due branch non sono collegati da checkout; • chechout , crea un working tree locale da un repository centrale (introdotto in Inizializzazione, operazioni avanzate (branch, checkout, merge, resolve) a pag.9); i due branch sono collegati: una commit sul locale produce la revisione anche sul centrale; • bind , converte il branch corrente nel checkout di un altro branch; • unbind , converte il checkout corrente in un branch autonomo. Esempio: caricamento di sorgenti su repository centrale da branch locale Nel repository dell'esempio (2) (pag.13) vogliamo portare il progetto già sotto controllo di versione dell'esempio (4) (a pag.7) e successivi. Già che ci siamo, prima di usare il comando corretto ( push ), proviamo quello sbagliato ( checkout : non va bene per legare un branch già esistente). >bzr init file://10.10.7.249/Repository/sviluppi/sito Created a repository branch (format: 2a) 5 Si ricordi che il checkout crea un branch locale legato al centrale. Una commit locale esegue la copia della revisione anche sul centrale. Pag. 14 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 Using shared repository: //10.10.7.249/Repository/sviluppi/ >cd C:\...\sviluppo\repo # errore: tentativo di checkout su branch già esistente! >bzr checkout file://10.10.7.249/Repository/sviluppi/sito sito bzr: ERROR: File exists: u'C:/.../sviluppo/repo/sito/.bzr': [Error 183] Impossibile creare un file, se il file esiste gi: u'C:/.../sviluppo/repo/sito/.bzr' >cd C:/.../sviluppi/repo/sito # invece il push funziona >bzr push file://10.10.7.249/Repository/sviluppi/sito Pushed up to revision 4. Siccome successivamente proveremo il caricamento di sorgenti non versionati, provvediamo ad eliminare il repository centrale. Nei comandi seguenti questo è accessibile da Y:\sviluppi : >Y: Y:\\ >cd sviluppi Y:\sviluppi\ >rmdir /s /q .bzr >rmdir /s /q sito Attenzione: il branch locale ha memoria dell'operazione di push. L'eliminazione del repository centrale può creare problemi di disallineamento nel branch locale? Questa è una ipotesi da indagare. Modifichiamo index.html e proviamo una commit : >cd C:\...\sviluppo\repo\sito\ # il branch ricorda il push! >bzr info Repository tree (format: 2a) Location: shared repository: C:/Documents and Settings/de falco/Desktop/writer.bazaar.note/sviluppo/repo repository branch: . Related branches: push branch: //10.10.7.249/Repository/sviluppi/sito submit branch: C:/Documents and Settings/luciano/Desktop/writer.bazaar.note/sviluppo/repo/test-css # modifichiamo index.html >bzr status modified: index.html >bzr commit -m "modified index, deleted central repository" Committing to: C:/.../sviluppo/repo/sito/ modified index.html Committed revision 5. Funziona lo stesso! Bene. Esempio: caricamento di sorgenti non versionati su repository centrale Vogliamo vedere un esempio di caricamento di un repository centrale a partire da Pag. 15 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 una directory di sorgenti ancora non sottoposta a versioning. Mettiamo i sorgenti in una directory pulita, senza controllo di versioning. Ad esempio copiamoli in c:\...\sviluppi\sito dell'esempio (3) (pag.7). Inoltre ricreiamo il repository centrale vuoto come in esempio (2) di pag.13. Dopo di che ricordiamoci di: • creare un branch centrale vuoto; • creare un checkout locale vuoto del branch predetto • copiare i sorgenti nel checkout locale • fare commit localmente; la revisione appena creata viene copiata anche sul repository centrale. Ecco la sequenza dei comandi. (8). . . .# creiamo il repository centrale vuoto >bzr init-repo --no-trees file://10.10.7.249/Repository/sviluppi Shared repository (format: 2a) Location: shared repository: //10.10.7.249/Repository/sviluppi # creiamo il branch principale centrale vuoto >bzr init file://10.10.7.249/Repository/sviluppi/sito Created a repository branch (format: 2a) Using shared repository: //10.10.7.249/Repository/sviluppi/ # andiamo sul repository locale (ci deve essere. Se non c'è, crearlo) >cd c:/.../sviluppi/repo # facciamo checkout del centrale sul locale >bzr checkout file://10.10.7.249/Repository/sviluppi/sito sito-checkout # carichiamo e registriamo i file sul checkout locale >cd sito-checkout >copy ..\..\sito\* ..\..\sito\index.html ..\..\sito\page_1.html ..\..\sito\page_2.html ..\..\sito\test.css 4 file copiati. >bzr add adding index.html adding page_1.html adding page_2.html adding test.css # facciamo commit sul locale, si noti che lavora anche sul centrale >bzr commit -m "caricam.iniziale del checkout, vale anche per rep. centrale" Committing to: //10.10.7.249/Repository/sviluppi/sito/ added index.html added page_1.html added page_2.html added test.css Committed revision 1. Lavorare con i checkout (update, commit, commit --local, bind, unbind) Creare un repository centrale e caricarvi i sorgenti è solo l'inizio. Pag. 16 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 Ora si tratterà di usare il repository centrale da parte di più utenti. Come? Ogni utente si crea localmente un checkout del main branch centrale. Dopo di che lavora localmente, e quando ritiene opportuno fa commit. Ma la commit aggiorna il repository centrale. Che avviene se qualcun altro ha fatto commit prima di lui? La commit fallisce. Questo è il concetto base del lavoro in lockstep: non è permessa una commit se i sorgenti locali non sono allineati al repository centrale. I comandi fondamentali sono: • update , aggiorna il working tree locale rispetto il branch di riferimento; • commit , per creare una revisione sia nel branch locale che nel repository centrale; • commit --local , invece effettua il commit del solo working tree locale senza necessità del preventivo update e senza copiare la nuova revisione sul branch di riferimento; • bind , unbind , sono usate per trasformare un branch in chechout e viceversa, come pure per spostare un checkout da un main branch ad un altro. Si noti che l' update lavora con la stessa logica del merge . Di conseguenza si capisce che possono sorgere conflitti durante questa operazione, conflitti da risolvere per poi poter effettuare con successo una richiesta di commit . Riguardo il comando commit con l'opzione -–local , Viene utilizzato per poter lavorare con un checkout quando si è offline rispetto il repository centrale. Quando si ritiene necessario effettuare nuovamente commit verso il repository centrale, sarà necessario effettuare un update e poi il solito commit , questa volta senza --local . Esempio: modifiche a due checkout del main branch centrale Riprendiamo la situazione finale dell'esempio (8) (pag.16). Per vedere che succede lavorando in lockstep, creiamo dal file://10.10.7.249/Repository/sviluppi/sito i due working tree c:\...\sviluppi\repo\sito-c1 e c:\...\sviluppi\repo\sito-c2 >cd C:\...\sviluppo\repo centrale locali: >bzr checkout file://10.10.7.249/Repository/sviluppi/sito sito-c1 >bzr checkout file://10.10.7.249/Repository/sviluppi/sito sito-c2 Modifichiamo index.html in sito-c1 , facciamo commit , modifichiamo page_1.html di s ito-c2 e facciamo commit : andiamo in errore perché sito-c2 non è allineato al repository centrale. >cd sito-c1 # modifichiamo index.html e facciamo commit >bzr status modified: index.html >bzr commit -m "sito-c1 modificato index.html" Committing to: //10.10.7.249/Repository/sviluppi/sito/ Pag. 17 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 modified index.html Committed revision 2. # andiamo in sito-c2, modifica di page_01.html, commit: errore! >cd ..\sito-c2 >bzr status modified: page_1.html >bzr commit -m "sito-c2 modificato index.html" bzr: ERROR: Bound branch BzrBranch7('file:///C:/.../sviluppo/repo/sito-c2/') is out of date with master branch BzrBranch7('file://10.10.7.249/Repository/sviluppi/sito/'). To commit to master branch, run update and then commit. You can also pass --local to commit to continue working disconnected. Come suggerito nel messaggio di errore: facciamo update e poi commit di nuovo. >bzr update M index.html All changes applied successfully. Updated to revision 2 of branch //10.10.7.249/Repository/sviluppi/sito >bzr status modified: page_1.html >bzr commit -m "sito-c2 modificato index.html" Committing to: //10.10.7.249/Repository/sviluppi/sito/ modified page_1.html Committed revision 3. Ora la commit ha funzionato. Si nota che l' update non ha toccato il file page_1.html che abbiamo modificato: funziona come il merge . Esempio: commit locale e successivo riallineamento al branch centrale Con il seguente scenario: • repository centrale su directory \\Pc-marco-home\landisk\sviluppi\ • branch centrale su \\Pc-marco-home\landisk\sviluppi\sito • branch locale (copia di ...\sviluppi\repo\sito ) su ... \sviluppi\repo\home Vogliamo trasformare il branch home in un checkout del branch centrale. Quindi fare un paio di commit locali nel checkout. Infine riportare gli aggiornamenti sul repository centrale. # questo è un branch locale da cui carichiamo il repository centrale >cd c:\...\sviluppi\repo\home >bzr push \\Pc-marco-home\landisk\sviluppi\sito Pushed up to revision 5. # ora trasformiamo il branch in un checkout, la info conferma >bzr bind \\Pc-marco-home\landisk\sviluppi\sito >bzr info Repository checkout (format: 2a) Location: repository checkout root: . checkout of branch: //Pc-marco-home/landisk/sviluppi/sito shared repository: C:/.../sviluppo/repo Related branches: Pag. 18 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 push branch: //Pc-marco-home/landisk/sviluppi/sito parent branch: C:/.../sviluppo/repo/sito # modifichiamo index.html e facciamo commit con il repository centrale >bzr commit -m "index modified in home" Committing to: //Pc-marco-home/landisk/sviluppi/sito/ modified index.html Committed revision 6. # modifichiamo altre due volte index.html e facciamo altrettanti commit locali >bzr commit --local -m "index modified again in home" Committing to: C:/Documents and Settings/luciano/Desktop/writer.bazaar.note/sviluppo/repo/home/ modified index.html Committed revision 7. >bzr commit --local -m "index modified again and again in home" Committing to: C:/.../sviluppo/repo/home/ modified index.html Committed revision 8. # nuova commit normale: ERRORE, perché non abbiamo fatto update >bzr commit -m "now commiting to central repository" bzr: ERROR: Bound branch BzrBranch7('file:///C:/.../sviluppo/repo/home/') is out of date with master branch BzrBranch7('file://Pc-marcohome/landisk/sviluppi/sito/'). To commit to master branch, run update and then commit. You can also pass --local to commit to continue working disconnected. # procedura corretta: update (torniamo alla rev.6 del rep.centrale), poi commit >bzr update M index.html All changes applied successfully. M index.html All changes applied successfully. Updated to revision 6 of branch //Pc-marco-home/landisk/sviluppi/sito Your local commits will now show as pending merges with 'bzr status', and can be committed with 'bzr commit'. >bzr commit -m "now commiting to central repository" Committing to: //Pc-marco-home/landisk/sviluppi/sito/ modified index.html Committed revision 7. # il log ci mostra che siamo a rev.7 >bzr log -----------------------------------------------------------revno: 7 [merge] committer: ldfa <[email protected]> branch nick: sito timestamp: Fri 2010-05-07 22:25:52 +0200 message: now commiting to central repository #... CUTTED... -----------------------------------------------------------revno: 1 committer: ldfa <[email protected]> branch nick: sito timestamp: Tue 2010-05-04 19:39:59 +0200 message: primo snapshot -----------------------------------------------------------Use --include-merges or -n0 to see merged revisions. Cenni per lavorare in modalità distribuita Per lavorare in modalità distribuita rispetto un repository centrale, si introduce un Pag. 19 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 ulteriore livello di disaccoppiamento. In pratica, ogni programmatore avrà il suo branch o checkout locale del repository centrale. Ma questo non viene utilizzato direttamente per le modifiche al codice. Piuttosto è una copia di riferimento del branch centrale, detta mirror branch. . Dopo di che, ogni nuova funzione, o fix, viene sviluppata in un proprio branch, detto feature branch 6 , creato a partire dal mirror branch . Fin qui tutto come al solito. Ora vediamo come far confluire nel branch centrale una funzione o una fix sviluppata in modo delocalizzato. Sono possibili più scenari: • il più semplice prevede che ogni programmatore abbia i permessi per aggiornare il branch centrale; • oppure possiamo avere un amministratore del repository centrale, cui è delegata la responsabilità di controllare e accettare o meno lo sviluppo proposto. Inserimento di una nuova funzione nel trunk senza amministratore Quando una funzione è pronta per confluire nel branch centrale, supponendo di avere i permessi per aggiornare direttamente il branch centrale, si opera in tre fasi: • si aggiorna il mirror branch (update se è un checkout, pull se è un brach) rispetto il branch centrale; • si effettua il merge del mirror brench risolvendo eventuali conflitti; dal • si crea la revisione nel mirror commit+push se è un branch). (commit branch task branch se è interessato, un checkout, Inserimento di una nuova funzione nel trunk con amministratore Se non si hanno i permessi di aggiornare il branch centrale, sarà necessario inviare il codice da inserire all'amministratore del repository centrale. Questa persona effettuerà l'analisi del codice con gli strumenti usuali (staus, diff, ...). Se a valle di questa analisi, deciderà di accettare il codice ricevuto, provvederà ad effettuare la commit . Il comando di richiesta è: • send , invia 7 le informazioni 8 necessarie per richiedere una commit. 6 O task branch. 7 Invia tramite email, oppure è possibile avere in uscita un file, da controllare e successivamente inviare autonomamente. 8 Si tratta di una sorta di mini-branch. Pag. 20 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 Appendici Gestione del “warning some compiled extensions could not be loaded” Nella mia configurazione a volte ho il warning: bzr: warning: some compiled extensions could not be loaded; see ...(CUTTED)... Per evitarlo, inserire la direttiva: ignore_missing_extensions = True nel file di configurazione bazaar.conf , che è nella directory: C:\Documents and Settings\utente\Dati applicazioni\bazaar\2.0\ Nota. Questo problema non è stato risolto dall'installazione della libreria pywin32. Utenza e password per il “file schema” in Windows non funzionano Per effettuare operazioni verso server remoti spesso è necessario dichiarare utenza e password. Ma in Windows per collegarsi a file system remoti Bazaar ha problemi nell'utilizzare l'utenza necessaria. A questo fine Bazaar prevede diverse possibilità. Ne ho provate due, entrambe con esito negativo. La prima è il file di configurazione authentication.conf , che è nella solita directory: C:\Documents and Settings\ utente \Dati applicazioni\bazaar\2.0\ Il file viene letto, ma i valori inseriti non funzionano. La seconda possibilità consiste nell'inserire utenza e password a linea di comando. Ad esempio come segue: bzr init-repo file://user:[email protected]/Repository/sviluppi/test-bazaar anche in questo caso senza esito positivo. Per questi motivi è necessario provvedere preventivamente, da sistema operativo, ad instaurare un collegamento verso il server con le autenticazioni corrette. Ad esempio si può usare: net use Y: \\10.10.7.249\Repository password /USER:user oppure effettuare un collegamento tramite Esplora risorse sulle risorse di rete. Riferimenti Id [1] [2] [3] [4] Riferimento Bazaar web home Bazaar download Bazaar documentation Bazaar Tutorial [5] Bazaar User Guide Autore Nota home del sito WEB di Bazaar link per il download di Bazaar Indice della documentazione di Bazaar Bazaar Developers Introduzione all'utilizzo di Bazaar. Filename: bzr-en-tutorial.pdf Bazaar Developers Manuale d'uso di Bazaar. Filename: bzr-en-user-guide.pdf Pag. 21 of 22 Appunti per l'uso di Bazaar cons. pubblica v.1.1 del 10 mag 2010 Acronimi e abbreviazioni Acronimo CVS Nota Concurrent Version System. E' l'antesignano dei programmi di controllo versione. Il primo rilascio, autore Dick Grune, risale al 1986. Continuamente migliorato dalla comunità open source. Software Configuration Management. Un sinonimo di Version Control System. Apache Subversion. Inizialmente sviluppato nel 2000 da CollabNet Inc. E' un altro programma di riferimento per il controllo versione. Version Control System. Genericamente un sistema di controllo versione. SCM SVN VCS Identificazione e storia del documento Ver 1.0 1.1 del 07 mag 2010 10 mag 2010 autore Ldfa Ldfa Descrizione Stesura iniziale aggiunto commit --local aggiunti i cenni per lavorare in modalità distribuita Pag. 22 of 22
Documenti analoghi
Gestione della configurazione del software
– Dopo aver etichettato i file, si può creare il pacchetto relativo al
modulo da rilasciare