Linuxtrent: Re: CVS questions

  • From: Lele Gaifax <lele@xxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxxxxxx
  • Date: Fri, 20 Apr 2001 19:10:17 +0200

>>>>> On Fri, 20 Apr 2001 12:52:32 +0200, "Mauro Colorio" 
>>>>> <linuxbox@xxxxxxxxxxxx> said:

    MC> Domanda

    MC> io ho un'alberatura di directory tipo

    MC> applicazione | --- server | --- client


    MC> ora voglio aggiungere una directory sotto applicazione (tipo
    MC> la directory lib) come devo fare?

    MC> da quel che ho capito ci sono 2 strade

    MC> 1. usare il metodo add, ho provato a copiare la directory che
    MC> voglio aggiungere in locale e poi ho provato ad usare add ma
    MC> mi dice

    MC> cvs -z9 add lib (in directory D:\applicazione) cvs add: in
    MC> directory .: cvs [add aborted]: there is no version here; do
    MC> 'cvs checkout' first

Ma eri nella directory di lavoro? Per intenderci, c'è la sottodir CVS?

Questo dovrebbe funzionare:

$ cd /tmp
$ cvs co applicazione
$ cd applicazione
$ mkdir Lib
$ cvs add Lib
$ cd Lib
$ touch filenuovo
$ cvs add filenuovo
$ cvs commit filenuovo

Come spiegato in una mail precedente, CVS non dispone di alcuna
informazione sulle directory, ma solo sui file che queste
contengono. Nel caso di una directory il comando "add" altro non fa
che creare, nella directory specificata, la sottodirectory `CVS', che
contiene le informazioni "riservate" del CVS sui file che ha in
gestione. E' quando fai un add/commit di un nuovo file dentro quella
directory che si movimentano le cose sul server.

    MC> quindi credo di non aver capito il primo metodo:)

    MC> 2. usare il comando import

L'import serve primariamente per poter mantenere in un proprio
repository CVS roba proveniente da terze parti: io lo uso di fisso ad
esempio quando lavoro su free sw. Metti di voler apportare delle
modifiche al programma `tar': scaricato il programma originale,
diciamo la versione 1.13, lo importo nel mio repository in questa
maniera:

$ cd /tmp
$ tar -xzf tar-1.13.tar.gz
$ cd tar-1.13
$ cvs import tar fsf fsf_1_13

Questo importa appunto nel tuo repository l'intero albero originale di
`tar', appiccicandoci due etichette: `fsf', che quindi potrà essere
usata per indicare "l'ultima versione originale della fsf", e
`fsf_1_13', che indica questa versione specifica. CVS importa i
sorgenti nel ramo "1.1", quindi alla prima importazione, ogni file
ottiene l'ID "1.1.1.1". Alla successiva importazione, che spiego dopo,
i file modificati (e solo quelli), avranno ID "1.1.1.2", e così
via. La tag `fsf', nell'esempio sopra, indica appunto "l'ultima
versione del ramo 1.1"...

A questo punto, una volta estratto l'albero, apporto le mie modifiche
e faccio un commit:

$ cd $HOME/WiP
$ cvs co tar
$ cd tar
$ emacs buffer.c
$ <vi risparmio la sessione emacs :->
$ cvs ci buffer.c

Ora il file `buffer.c' avrà ID "1.2". Compilo e cosi via, il tempo
passa... esce la versione 1.14! Scarico come sempre l'originale e lo
reimporto nel mio CVS:

$ cd /tmp
$ tar -xzf tar-1.14.tar.gz
$ cd tar-1.14
$ cvs import tar fsf fsf_1_14

Questo importa i nuovi sorgenti *originali* nel loro apposito ramo,
l'"1.1". Nel caso più fortunato, quando cioè io *non* abbia apportato
delle modifiche che in qualche modo "collidono" con i cambiamenti nei
sorgenti originali, il caso è chiuso, non devo far altro che
aggiornare i miei sorgenti, o riestrarre tutto di nuovo:

$ cd $HOME/WiP/tar
$ cvs update

CVS è sufficientemente furbo per integrare le modifiche all'originale
con quelle fatte da me: supponendo che l'autore abbia solo aggiornato
il Copyright in cima al sorgente `buffer.c', al termine dell'update mi
ritroverò, nella mia working directory, la versione "1.2" del file,
contenente le mie modifiche E il copyright aggiornato, cosicché, una
volta stabilito che tutto funziona ancora, faccio

$ cvs commit -m "Merged with upstream 1.14"

creando così la versione "1.3" di `buffer.c'.


Se invece le modifiche collidono, cioè entrambi abbiamo modificato ad
esempio i parametri di una certa funzione, allora CVS non è in grado
di stabilire quale sia la versione "giusta" (che di fatto non esiste!)
e segnala quindi un "conflitto", che deve essere risolto a
manina. Come ti dice anche il CVS stesso nel messaggio di commit, per
risolvere tutte le ambiguità dovrò fare quanto segue:

$ cd $HOME/tar
$ cvs update -jfsf:yesterday -jfsf

che detta in parole povere è "aggiornami la directory locale,
applicando le stesse modifiche apportate al ramo `fsf' tra ieri ed
oggi". Come ho detto, essendoci un conflitto in `buffer.c', nella
directory di lavoro mi troverò tre file modificati, due nuovi e
nascosti, rispettivamente `.buffer.c.#1.2' e l'altro
`.buffer.c.#1.1.1.3' (ovviamente andando a memoria i nomi potrebbero
essere un pochino diversi) che evidentemente contengono la *mia*
versione 1.2 e la versione *originale* 1.1.1.3, che contengono appunto
il conflitto. Il terzo file è `buffer.c', che dovrò editare per
eliminare il conflitto, che _grosso_modo_ è segnalato in questo modo:

<<<<<< 1.2
void initialize(const char *progname);
======
void initialize(char *progname);
>>>>>> 1.1.1.3

E' evidente che qui devo scegliere, o comunque ricomporre, una delle
due modifiche, togliendo di mezzo anche i demarcatori.

Una volta completata la risoluzione del conflitto, quindi con un mio
`tar' di nuovo compilabile, eseguo il solito commit

$ cvs commit -m "Merged with upstream 1.14" buffer.c


Mantenendo *sempre* i sorgenti in questo modo, dovendo spedire le mie
modifiche all'autore, è sufficiente un

$ cd /tmp
$ cvs rpatch -rfsf -Dnow tar > tar-1.14.patch

per ottenere in un unica patch tutte le mie modifiche rispetto
all'ultima versione del ramo `fsf'.

Con la stessa semplicità, posso curiosare nelle modifiche apportate
all'originale, con:

$ cvs rdiff -rfsf_1_13 -rfsf_1_14 tar | less

:-)

    MC> qualcuno sa spiegarmi la differenza e come si usano?  o
    MC> semplicemente ocme cavolo faccio ad aggiungere una directory
    MC> all'alberatura di CVS?

Spero di averti chiarito i due concetti, comunque a disposizione per
eventuali altri... con en zerto raspeghim en gola che no so... :-)

ciao, lele.
-- 
nickname: Lele Gaifax   | Quando vivro' di quello che ho pensato ieri
real: Emanuele Gaifas   | comincero' ad aver paura di chi mi copia.
email: lele@xxxxxxxxxx  |               -- Fortunato Depero, 1929.

-- 
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con SOGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxxxxxx


Other related posts:

  • » Linuxtrent: Re: CVS questions