2010-06-05 13 views
6

Usando Git o Mercurial, come faresti a sapere quando fai un clone o un pull, nessuno sta registrando i file (spingendolo)? Può essere importante che:Usando Git o Mercurial, come faresti a sapere quando fai un clone o un pull, nessuno sta controllando i file (spingendolo)?

1) Non si sa mai che è in uno stato incoerente, quindi si prova per 2 ore cercando di eseguire il debug del codice quando il codice è in uno stato incoerente.

2) Con tutto il codice framework (come Ruby on Rails) - potenzialmente centinaia di file - se alcuni file non sono coerenti con l'altro, non è possibile che lo rake db:migrate o script/generate controller causi danni o incongruenze al codice base?

+3

Git e Mercurial non sono l'unico VCS che soffrono di incoerenza. Posso controllare il codice rotto nel mio repository Subversion e lasciare il codice di debug per 2 ore. La comunicazione è la chiave! Comunicazione – basszero

+3

* è * chiave. È anche il motivo per cui il controllo del codice sorgente è solo un aspetto dello sviluppo del software. –

risposta

16

Pull e push sono atomici in Git e Mercurial. Significa che non ti permetteranno mai di ottenere un changeset parzialmente spinto. Otterrai sempre un intero changeset.

Aggiornamento: Ho solo pensato che potreste aver paura "Che cosa succede se qualcuno sta spingendo una serie di changeset e ne otterrò alcuni". Quindi si tratta della comunicazione e del flusso di lavoro accettati nel progetto.

Si accetta spesso che ogni commit al trunk (master o come lo si chiami) dovrebbe lasciare il codice in uno stato coerente. Se qualcuno sa che farà dei cambiamenti che creeranno delle incoerenze temporanee, dovrebbe farlo in un ramo e se è pronto lo unirà al tronco. Quindi il trunk viene portato nello stato del ramo in un commit, quindi lo vedrai sempre coerente.

Aggiornamento 2: Come ha detto Tonfa nel commento - in Mercurial la spinta è atomica. Ho fatto un semplice test in git e anche le push sono atomiche. Quindi non devi temere tali incoerenze se sai che altri sviluppatori spingono i changeset funzionanti. (anche se le dichiarazioni precedenti sui rami sono ancora valide).

+4

Non lo so per git, ma in hg se qualcuno spinge più cset, compaiono solo quando la spinta è finita, atomicamente (la mia ipotesi sarebbe che git faccia lo stesso, cambiando il puntatore in cima al ramo solo a Alla fine), – tonfa

+0

Ah, sì, probabilmente hai ragione. – silk

1

Quando faccio un pull in hg, se non ci sono cambiamenti, ho una:

pulling from <REPOSITORY NAME> 
searching for changes 
no changes found 

Quindi so non ci sono stati cambiamenti dall'ultima volta che ho tirato. Inoltre, puoi sempre consultare la cronologia del repository e vedere quali modifiche sono state apportate.

2

Come altri hanno già detto, i commit sono atomici in modo da non avere un problema con un'incoerenza dovuta a un commit parziale.

Ciò che questa risposta aggiunge alla conversazione è che si ha la possibilità di aggiungere hook di preavvio che forzano una corsa pulita della suite di test prima che il commit sia consentito.

http://git-scm.com/docs/githooks

https://www.mercurial-scm.org/wiki/Hook