Usare CVS

Il pacchetto cvs deve essere installato sul sistema per essere configurato come server CVS.

La configurazione di server CVS prevede i seguenti passaggi:
1. Inizializzare il repository
2. Creare un gruppo utenti per il CVS
3. Aggiungere utenti al gruppo di utenti CVS
4. Modificare il gruppo per CVSROOT
5. Modificare i permessi su CVSROOT

L'inizializzazione del server CVS fa riferimento alla creazione della directory definita CVSROOT del server e al relativo popolamento con i file di configurazione del server e dei moduli. Come root, eseguite il seguente comando, dove /usr/local/CVS/ è il CVSROOT:
cvs -d /usr/local/CVS init

Questo comando crea la directory /usr/local/CVS/ sul server. In questa viene creata anche una directory chiamata CVSROOT. Si tratta di uno speciale modulo che contiene i file di configurazione per il repository. I file di questo speciale modulo non dovrebbero essere modificati direttamente sul server (l'unica eccezione è se si crea un file di password per l'autenticazione in modo tale che risulti impossibile intercettarli sulla rete e permetterne agli utenti di averne una copia locale).
Per modificare i file di configurazione, estraete una copia di lavoro del modulo CVSROOT su una macchina client, modificate i file e registratelo di nuovo nel repository.
A questo punto, aggiungete un gruppo di utenti a cui dovrebbero appartenere tutti gli utenti CVS validi:
groupadd cvs

Dopo, aggiungete tutti gli utenti che devono poter accedere al repository CVS al gruppo cvs in modo che possano avere i permessi di lettura e scrittura per il repository. Se gli utenti non esistono sul server, occorre inanzitutto crearli.
Cambiate il gruppo per tutti i file contenuti nella directory sul server designato come CVSROOT:
chgrp -R cvs /usr/local/CVS

Modificate i permessi di tutti i file di questa directory in modo che solo gli utenti apparteneni al gruppo possano accedere ai file:
chmod -R 770 /usr/local/CVS

Ora che il repository è configurato, è possibile importare i moduli.
Ricordate di eseguire il backup del repository sul server nel caso in cui si verifica qualche problema al filesystem sul server. Dato che i file di configurazione si trovano nella stessa directory degli altri file del repository, all'elenco di file di backup per il server deve essere aggiunta solo la directory CVSROOT.

Spostare un modulo in un repository differente
Per spostare un modulo su altro server, è necessario archiviare la directory corrispondente, trasferirlo sul nuovo server CVS e togliere dall'archivio il modulo nel CVSROOT del nuovo server. Per spostare l'intero repository, archiviate la directory CVSROOT e toglietala dall'archivio del nuovo server.

Configurazione del sistema client
Il pacchetto RPM cvs deve essere installato sui sistemi client.
Il tipo di configurazione di un sistema client che deve essere collegato ad un server CVS dipende dal server che intendete utilizzare e dal tipo di autenticazione adottata dal server. Le due variabili d'ambiente CVSROOT e CVS_RSH devono essere impostate ai valori corretti per il server. Se il server CVS è un sistema Red Hat Linux, impostate il CVSROOT sul sistema client aggiungendo la seguente riga al file  .bashrc in ciascuna directory home degli utenti CVS:
export CVSROOT:ext<yourusername>@cvs\
           server.example.com/path/to/servercvsroot

Sostituite <yourusername> con il nome utente per l'account CVS, sostituite cvsserver.example.com con il nome host del server CVS e infine sostituite /path/to/servercvsroot con la directory sulla directory root CVS presente sul server.

Un altro utile file di configurazione presente nella directory home di ciascun utente è il file .cvsrc, che contiene l'elenco dei comandi CVS con argomenti opzionali che possono essere utilizzati durante l'esecuzione dei comandi. Per esmpio, se desiderate visualizzare i file diff nel formato output unificato, aggiungete la riga seguente al file:
diff -u
          rdiff -u


Per creare delle directory che esistono nel repository ma non nella vostra copia di lavoro e per rimuovere delle directory della vostra copia di lavoro nel caso in cui la directory contenuta nel rpository non contenga file al momento in cui viene eseguito il comando cvs update, aggiungete al file :
update -dP
L'opzione -d specifica che è possibile creare delle directory se queste vengono aggiunte al repository, e -P rappresenta l'opzione che consente l'eliminazione delle directory vuote.

Importazione di moduli CVS
Prima di importare i file per un nuovo modulo nel repository (server), verificate il modulo CVSROOT e aggiungete una voce per il nuovo modulo nel file modules:
cvs checkout CVSROOT

Questo comando consente la creazione della directory CVSROOT nella directory corrente, producendo così una copia del lavoro del modulo. Modificate il file modules nella directory appena creata per dichiarare il nuovo modulo. Ogni riga del file è una dichiarazione del modulo del formato:
modulename dir/to/module
dir/to/module è relativo alla directory root CVS contenuta nel repository. Ad esempio, per aggiungere un modulo definito myproject, aggiumgete la riga
myproject               myproject
al file modules. Dopo avere aggiunto il modulo registrate ail file modules nel repository:
cvs commit -m "add myproject module" modules

A questo punto, importate il file per il modulo. Utilzzate la directory che contiene i file da aggiungere al nuovo modulo. Tutti i file vengono copiati sul server, quindi accertatevi che nella directory corrente siano presenti solo i file che desiderete importare. Per importare i file eseguite il comando:
cvs import  -m "initial import" myproject/ <vendor-tag> <relase-tag>

Sostituite <vendor-tag> con il nome della vostra società e le vostre iniziali. Sostituite <relase-tag> con un numero di versione.
Il comando import copia tutti i file presenti nella directory corrente sul server nella directory relativa al modulo.
Nell'esempio, il nome del modulo e quello della directory relativa alla directory root CVS sono identici, sebbene non sia indispensabile.
Con l'importazione dei file per un modulo, la directory corrente non diventa automaticamente una directory modificabile per il modulo. Estraete il modulo dal server prima di modificare ulteriormente i file. E' consigliabile tenere una copia dei file del modulo importati nel CVS fino a quando non viene verificato che il modulo contenga tutti i file necessari.

Estrazione di un modulo
Per estrarre un modulo eseguite il secondo comando dove <module-name> è il nome del modulo:
cvs checkout <module-name>

Per default, nella directory corrente viene creata una directory avente lo stesso nome del modulo, e tutti i file del modulo vengono scaricati nella directory.
Per specificare il nome della directory, utilizzate il comando seguente:
cvs co -d <directory> <module-name>
Nota che il comando è abbreviato.

Registrazione dei file
Per salvare le modifiche apportate a un file nella copia di lavoro di un modulo, registrate il file nel repository. Per stabilire cos'è cambiato nella copia di lavoro del file, usate il comando:
cvs diff <filename>
Verrano visualizzate le differenze tra il file della vostra copia di lavoro e l'ultima revisione del file nel repository.
Per rendere effettive le modifiche usate il comando:
cvs commit -m "some log message" <filename>
Sostituite some log message con un messagio di log che descriva la modifica in modo da ricordare perchè sia stata necessaria.
Se il comando commit viene eseguita specificando il nome del file, tutti i file modificati nella directory corrente e le sottodirectory vengono riposti nel repository, inclusi i file aggiunti con il comando cvs add e quelli eliminati con cvs remove, in altre parole il comando è ricorsivo.
Per specificare nomi di file multipli è possibile utilizzare wild card. Ad esempio:
commit -m "some log message" *.c

Questo permette di registrare nella directory corrente qualsiasi file modificato o aggiunto con il comando cvs add che termina con l'estensione .c. Le wild card non sono ricorsive e non includono file che devono essere rimossi con il comando cvs remove. Per confermare la rimozione di un file, questo deve essere esplicitamento specificato con il comando cvs commit.
Se non viene specificato un messaggio di log con il comando cvs commit, verra avviato l'EDITOR di default, digitate un messaggio di log e salvate il file per completare il processo di registrazione.

Aggiornamento dei file
Dato che il CVS è un sistema multiutente è indispensabile poter acceder ai file agggiornati da altri utenti. Nella directory che contiene la copia di lavoro del modulo, eseguite:
cvs udate
in modo da recuperare i file più recenti dal repository. I file aggiunti nel repository vengono eliminati nella copia di lavoro e i file modificati nel repository sono aggiornati nella copia di lavoro. Se la copia di lavoro contiene un file che è stato modificato localmente ma non è ancora registrato, e lo stesso file è stato modificato nel repository perchè un altro utente ha effettuato una modifica dopo l'ultimo aggiornamento della copia di lavoro, il file locale viene aggiornato con le modifiche del repository. Se la correzione non viene effetuata in modo corretto (ad es. lo stesso contenuto è stato modificato a livello locale e nella revisione del repository), i messaggi CVS mostrano la presenza di conflitti di file. In seguito vedremo il da farsi.

Aggiunta di file
Se si aggiunge un file alla copia di lavoro di un modulo, la volta successiva in cui le modifiche vengono registrate, il nuovo file non verrà automaticamente aggiunto nel repository sul server CVS. Occorrerà eseguire il comando:
cvs add <filename>
e dopo l'esecuzione con il comando cvs commit il file verrà effetivamente incluso nel repository.

Rimozione dei file
Analogamente a quanto visto per l'aggiunta di un file, per rimuovere un file utilizzeremo il comando:
cvs remove <filename>

Dopo la relativa registrazione il file viene spostato nell'Attico del repository sul server. Le revisioni precedenti del file vengono conservate sul server ma il file viene rimosso dalla copia di lavoro di ciascun utente quando questo aggiorna i file con le ultime revisioni. Il file può essere recuperato dall'Attico in qualsiasi momento e aggiunto alla lista dei file attivi per il repository.
Quando si registra la rimozione è necessario specificare il nome esatto del file, anche la mancata specificazione del file ne determina la rimozione ma verrano registrate anche tutte le altre modifiche.
Non è possibile utilizzare wild chard per specificare i file da rimuovere.

Utilizzo dei rami
Il modulo CVS e' paragonabile a un albero. La versione iniziale del modulo e' definita TESTA e forma il tronco dell'albero. Proprio come gli alberi anche un modulo CVS puo' avere dei rami. Il modulo puo' essere spezzato in piu' rami, il cui sviluppo puo' continuare senza intaccare la TESTA del modulo. Un modulo puo' avere piu' di un ramo che poggia sulla TESTA ed e' possibile far nascere rami nuovi da quelli gia' esistenti.
Utilizzando la directory che contiene la copia del lavoro del modulo per creare un ramo utilizziamo il comando:
cvs tag -b <branchname>

Sostituite <branchname> con il nome del ramo. Questo comando non trasforma la directory corrente in una copia di lavoro del ramo. La copia di lavoro non subisce alterazioni.
Dopo la creazione del ramo, scaricatelo con il comando:
co -d <directory> -r <branchname> <module-name>

Sostituite <directory> con la directory (relativa alla directory corrente) nella quale volete creare la copia di lavoro del ramo, <branchname> con il nome del ramo e <module-name> con il nome del modulo.

Unione dei rami
E' possibile unire un ramo a un altro ramo dello stesso modulo (oppur unire un ramo el testa). Ad esempio, per unire il contenuto del ramo A nel ramo B, modificate le directory sulla copia di lavoro del ramo B ed eseguite il comando:
cvs update -j <branchname>

dove <branchname> e' il nome del ramo A.
Questo comando non registra le modifiche nel repository ma solo le copie locali dei file.Se si verificano dei conflitti con l'operazione di unione, verrano visualizzati dei messaggi che indicano quali sono i file interessati. Provate a risolvere i conflitti(in seguito vedremo come) e registrate le modifiche nel repository.

Visualizzazione dello stato dei file
E' possibile visualizzare lo stato dei file in qualsisi momento con il comando:
cvs status <filename>

Potremo visualizzare quanto segue:

Up-to-date
La revisione del file nella copia di lavoro e' identica all'ultima revisione relativa al ramo nel repository.
Locally Modified
Il file e' stato aggiornato all'ultima revisione per il ramo, ma e' stato modificato  nella copia di lavoro locale.
Locally Added
Il file e' stato aggiunto a livello locale ma non e' stato ancora aggiunto al repository sul server.
Locally Removed
Il file e' tato rimosso dalla copia di lavoro ma la rimozione non e' ancora registrata sul server.
Needs Checkout
Una revisione piu' recente del file si trova sul server e deve essere recuperata, quindi dovremo aggiornarlo con il comando cvs update.
Needs Patch
La revisione della copia di lavoro necessita di una patch per essere l'ultima revisione sul server.Utilizzate il comando cvs update per risolvere il problema.
Needs Merge
Sul server esiste una revisione piu' recente del file e la copia di lavorocontiene modifiche non ancora registrate.Questo stato e' tipico quando l'ultima revisione del file non e' stata scaricata sebbene il file sia stato comunque modificato.
File had conflicts on merge
E' simile a Needs Merge salvo il fatto che non possono essere risolte dopo il comando cvs update
Unknown
Il server CVS non sa nulla di questo file. Non e' stato aggiunto ne' rimosso a livello locale e non mai stato registrato sul server.

Per daterminare il ramo e i nomi tag di un file di un determinato modulo, eseguite il comando:
cvs status -v <filename>

Per visualizzare i messaggi di log per un file, eseguite il comando:
cvs log <filename> | less

Risoluzione dei conflitti

Se modificate un file e lo stesso contenuto viene modificato da un altro utente e registrato per primo, probabilmente comparira' un messaggio simile a questo:
RCS file: /usr/local/DOCCVS/docs/module-name/filename,v
retrieving revision 1.12
retrieving revision 1.13
Merging differences between 1.12 and 1.13 into filename
rcsmerge: warning: conflicts during merge
cvs server: conflicts found in filename C filename


Per risolvere il conflitto, aprite il file nell'editor di testo preferito, eseguite una ricerca di <<<<<<< e determinate qulae revisione del contenuto deve esssere inclusa nell'ultima revisione del file CVS.Per esempio:
Some line
<<<<<<< filename
This line was changed in your working copy.
=======
This is the same line changed and alredy commited.
>>>>>>> 1.13

Il contenuto tra <<<<<<< e ======= e' la riga modificata nella copia di lavoro. Il contenuto tra ======= e >>>>>>> e' il contenuto incluso nell' ultima revisione del server CVS.E' possibile risolvere il conflitto determinando quale riga dovrebbe trovarsi nel repository e registrando il file.

Interfaccia Web

Se preferite un'interfaccia web al CVS, potete installare ViewCVS, disponibile all'indirizzo http://viewcvs.sourceforge.net.

Privacy Policy