[Linux-Biella] Differenze cvs e svn

Emanuele Aina em a nerd.ocracy.org
Mer 3 Ott 2007 12:01:09 CEST


Paolo Ciarrocchi indicò:

> - Everyday GIT with 20 Commands Or So
>   http://www.kernel.org/pub/software/scm/git/docs/everyday.html

Non voglio sembrare quello che si lamenta e basta senza motivo, quindi 
proverò a darti un'idea del perché trovo GIT più complicato di 
Mercurial. Ovviamente vorrebbe essere una critica costruttiva, cosicché 
mi sia più semplice lavorare con i progetti che usano GIT.

> git-init(1) or git-clone(1) to create a new repository.

Ok, qui è uguale.

> git-fsck(1) to check the repository for errors.

«hg verify» ma la sostanza è identica.

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

Quando devo impacchettare? Spesso? Raramente? Quali sono i tradeoff di 
impacchettare?

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?

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

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?

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

Per il resto sono talmente simili che le motivazioni tecniche si 
esauriscono e diventa solo una questione di gusti...

Ad esempio il formato del repository di GIT è più semplice ed elegante, 
ma solo se non si considerano i pack. Con questi allora è il formato di 
Mercurial a essere quello più omogeneo ed elegante, non necessitando di 
alcuna manutenzione.

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.

In git vorrei una netta distinzione tra il plumbing e le porcelain, 
cosicché io possa allegramente ignorare del tutto i primi. In Mercurial 
il problema non si pone essendo plumbing i moduli Python interni non 
esposti dalla ria di comando.


Poi c'è una cosa che mi è ancora molto nebulosa.
Come sono organizzati i branch di GIT?
Come sono implementati?
Come tiene conto della provenienza?
Se lo stesso cset viene scaricato da due branch differenti, a quale dei 
due appartiene?
Un branch può avere più teste?

Grazie. ;P

-- 
Buongiorno.
Complimenti per l'ottima scelta.


Maggiori informazioni sulla lista Linux