>>>>> 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