[Linux-Biella] Differenze cvs e svn

Emanuele Aina em a nerd.ocracy.org
Lun 8 Ott 2007 18:40:22 CEST


Paolo Ciarrocchi delineò:

>>>> "hg pull" e "hg update" possono venire fusi con "hg pull -u" se si vuole.
>>> Se ho capito bene hg pull -u equivale a git pull
>> Sì.
> 
> Quindi per fare il tracking di un progetto tu fai
> $ hg pull -u
> 
> Curioso.

Esatto. Se invece ci sto lavorando faccio solo "hg pull" e quando ho 
voglia ne faccio il merge.

>>>> 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. :)
> 
> Questo avveniva anche con cogito (progetto ora dismesso) ma...
> 
> Linus Torvalds once said, "If you deny the Index, you really deny git
> itself." (February 4, 2006, Git List Archives)
> 
> E ora che conosco meglio git devo dire che Linus aveva ragione.

Continuo a non capire quali siano i superpoteri derivanti da avere 
l'index esplicito... :(

E mi sono letto tutto "Embrace The Git Index"!

>> $ hg commit -m "ho modificato A e B" fileA fileB
>> $ hg commit -m "ho modificato C" fileC
>>
>> Nell'ultimo puoi omettere "fileC", essendo l'unico file ad avere
>> modifiche non commitate.
>>
>> Stessa cosa dicasi per SVN/Darcs/Bazaar. Persino CVS.
> 
> OK.
> 
> Ma quello che puoi fare con git è:
> modifico A
> modifico B
> git add A B
> modifico ancora A
> Decido se aggiungere questa ulteriore modifica di A all'index
> commit
> 
> E in un qualunque momento posso fare:
> git diff --index per vedere quello che sara' inserito nel prossimo commit.

In tal caso è un semplice commit a due stadi: faccio commit nell'index e 
poi faccio il commit vero e proprio.

Darcs risolve elegantemente il problema con "darcs amend-record", il 
quale incorpora le attuali modifiche alla working directory nell'ultimo 
commit fatto (ovviamente a patto che questo non sia stato già distribuito).

# modifico A
# modifico B
$ darcs record -a A B
# modifico ancora A
$ darcs diff
# Decido se aggiungere questa ulteriore modifica di A al commit
$ darcs amend-record -a A

In questo modo non si introducono dettagli implementativi come l'index e 
non serve usare alcuna opzione di "darcs diff" in quanto quello 
intermedio è un commit vero.

Vedrei bene un'estensione analoga per Mercurial ("hg amend"), visto che 
io uso MQ per fare la stessa cosa ma è un po' macchinoso:

# modifico A
# modifico B
$ hg commit A B
# modifico ancora A
$ hg diff
# Decido se aggiungere questa ulteriore modifica di A al commit
$ hg qimport -r .
$ hg qrefresh A
$ hg qdelete -r .

L'idea è che gli ultimi 3 comandi vadano sostituiti con un singolo "hg 
amend".

Negli esempi ho sempre elencato esplicitamente i file A e B ma non è 
necessario se questi sono gli unici a essere stati modificati.

> Se ci pensi bene, l'uso dell'index ti permette moltissime modalità
> lavorative differenti.

Boh, piuttosto di un commit a due stadi con index esplicito a me sembra 
molto più semplice avere un comando "amend".

> Per progetti piu' semplici si puo' comunque creare un alias e avere lo
> stesso comportamento di HG (commit -a di default).

Non credo sia questione di complessità del progetto.

Io mi ritrovo spesso a usarlo anche con repository molto piccoli.

Per lo scenario che hai descritto la soluzione di Darcs mi pare la migliore.

Rispetto a GIT consente persino di modificare il messaggio di commit per 
correggere gli errori ortografici che immancabilmente faccio! ;)

> Oppure usi git-gui (mai piu' senza).

No, vivo in un terminale con shell e vim, una GUI mi darebbe solo 
fastidio. Senza contare il fatto che spesso la userei via SSH... :)

-- 
Buongiorno.
Complimenti per l'ottima scelta.



Maggiori informazioni sulla lista Linux