[Linux-Biella] Differenze cvs e svn

Emanuele Aina em a nerd.ocracy.org
Gio 4 Ott 2007 21:23:31 CEST


Paolo Ciarrocchi anticipò:

>>> git-prune(1) to remove unused objects in the repository.
>>> git-repack(1) to pack loose objects for efficiency.
>>> git-gc(1) to do common housekeeping tasks such as repack and prune.
>> Ecco, qui mi perdo.
>>
>> Perché mi avanzano oggetti inutilizzati? Come sono entrati nel repo? Per
>> colpa di chi? Perché non sono stati eliminati subito?
> 
> " Aborting operations or backing out changes will leave useless
> dangling objects in the database. These are generally a small fraction
> of the continuously growing history of wanted objects, but checking
> for dangling objects using git-fsck-objects and reclaiming the space
> using git-prune can be slow. Pruning also breaks immutability of the
> database. Newer version of git feature a git-gc command which will
> combine the pruning and packing."
> 
> _Credo_ che nelle prossime versioni di GIT git/gc verra' invocato
> automaticamente in alcune circostanze.

Speriamo. :)

>> Quando devo impacchettare? Spesso? Raramente? Quali sono i tradeoff di
>> impacchettare?
> 
> Onestamente queste dubbi devono nascere solo se hai dei repository _enormi_.
> Nella documentazione mi sembra si consigli di fare un repack una volta
> alla settimana, per esempio mettendo il comando in crontab.
> 
>> git-gc chiama gli altri due aggiungendoci un po' di logica, quindi
>> -prune e -repack per me non esistono. Posso però chiamarlo dopo ogni
>> commit? Perché non è automatico?
> 
> Perche' sta per diventare automatico :-)

Speriamo tanto. :D

>>> git-pull(1) and git-fetch(1) from "origin" to keep up-to-date with the upstream.
>> git-pull è git-fetch + git-merge.
>>
>> git-fetch modifica la working directory?
> 
> Cioe?

Ti spiego come funziona in Mercurial così forse i miei dubbi sono più 
chiari. :)

hg clone http://selenic.com/hg/

cd hg

# passa del tempo, il repository remoto viene aggiornato

hg pull   # scarica e aggiunge i nuovi cset al DAG della storia senza
           # toccare la working directory

hg update # aggiorna la working directory portandola alla punta del DAG
           # della storia

"hg pull" e "hg update" possono venire fusi con "hg pull -u" se si vuole.

>> git-merge fonde due rami, il mio e quello remoto. Ma se io ho solo
>> cambiamenti nella working dir di cui non ho fatto commit, me
>>                                                   li fonde con la cima
>> del ramo corrente?
> 
> Credo di si ma non mi e' molto chiaro lo scenario.

hg clone http://selenic.com/hg/

cd hg

# passa del tempo, il repository remoto viene aggiornato
# nel frattempo aggiungo la feature "world domination" ma non ne faccio
# ancora commit

hg pull   # scarica e aggiunge i nuovi cset al DAG della storia senza
           # toccare la working directory

hg update # aggiorna la working directory portandola alla punta del DAG
           # della storia, fondendo i miei cambiamenti con quelli remoti

>>> git-push(1) to shared repository, if you adopt CVS style shared repository workflow.
>> Qui la descrizione è fuorviante. Cosa centra CVS? Io faccio push sui
>> miei repo pubblici su techn.ocracy.org, che non sono "shared" con nessuno...
> 
> Anche io lo faccio. La descrizione voleva ricordare l'uso di GIT con
> _UN_ repository centralizzato. E' sicuramente confusa.

Se lo è la documentazione, figurati il sottoscritto. %-)

>> Mercurial ha una implementazione sufficientemente pulita in Python con
>> alcuni pezzi critici in C. GIT è in parte C, in parte bash e in parte Perl.
> 
> Quasi tutto ora convertito in C. Al punto da esserci un installer per
> windows (nativo, non cygwin).

Meno male.

> _Credo_ che una differenza tra GIT e Mercurial sia l'uso dell'index  (
> o cache), io mi sto leggendo
> http://www.jdl.com/papers/Embrace_The_Git_Index.pdf

Letto, ma non capisco a cosa serva.

O meglio, capisco la sua utilità dal punto di vista interno, ma non 
capisco a cosa serva esporlo all'utente.

Mi sembra solo una specie di commit a due stadi senza particolari benefici.

Fortunatamente in Mercurial il dirstate (il quasi corrispettivo 
dell'index) è completamente nascosto all'utente. :)

>> Un branch può avere più teste?
> 
> Si.

Come? Da quel che ho capito un branch è identificato dal suo cset più 
recente.

I branch di Mercurial sono bestie differenti.

Ce ne sono di due tipi, come in GIT: quelli in stile Bazaar, ovvero i 
cloni di un repo, e quelli interni.

Quelli interni sono intesi per casi d'uso differenti da quelli in stile 
Bazaar in quanto, a differenza di questi, il nome del branch a cui un 
cset appartiene viene memorizzato all'interno della storia stessa.

Sono utili quando si vogliono mantenere linee di sviluppo differenti 
all'interno dello stesso progetto.

O almeno quella è la motivazione, solitamente vengono utilizzati molto 
raramente.

Essendo i branch interni di GIT non memorizzati nella storia non hanno 
una grande differenza rispetto a quelli esterni.

Anzi, per questo io preferisco questi ultimi visto che mi sembrano più 
"espliciti" e non richiedono altre conoscenze oltre al basilare "clone".

Perché dovrei usare quelli interni in GIT?

-- 
Buongiorno.
Complimenti per l'ottima scelta.



Maggiori informazioni sulla lista Linux