Cosa significa "commit atomico" per un sistema di versioning?


Risposte:


69

Significa che quando si esegue un commit nel sistema di controllo della versione o tutto ciò che si desidera eseguire, o nulla lo fa.

In CVS, quando si tenta di eseguire il commit è possibile che il commit abbia esito positivo su più file, quindi fallire su molti altri (perché sono stati modificati). Questo lascia il repository in uno stato sfortunato perché metà del tuo commit non c'è, ed è probabile che tu abbia lasciato le cose in uno stato in cui non verranno compilate o peggio. Ora devi sbrigarti e integrare qualsiasi modifica in modo da poter eseguire il commit degli altri file prima che qualcun altro debba aggiornare e ottenere il tuo set rotto di modifiche.

In SVN ciò non accadrà: SVN eseguirà il commit di tutto ciò che è stato modificato o non riuscirà l'intero changeet. Pertanto, non lascerai mai il repository in uno stato interrotto a causa di problemi di commit.


9
Un risultato importante di questo è che se il check out in un determinato Stato, allora il risultato è sempre uno stato coerente (salvo qualsiasi utente-errore come dimenticare di commettere un file, ovviamente): E ' sia dalla prima che il commit o da dopo l'impegno e niente in mezzo. In CVS potrebbe essere "a metà del commit". Il comportamento SVN è molto utile per cose come l'integrazione continua. Per i sistemi CVS, tali sistemi utilizzavano un "periodo di quiete" in cui utilizzavano un determinato check-out solo se non si effettuano più commit per un determinato numero di secondi / minuti dopo il checkout.
Joachim Sauer,

2
ricordi oscuri sull'uso di CVS mi hanno colpito mentre leggevo questo.
Shabunc

9
@Spoike - vero, ma è un atto deliberato. In CVS, i problemi possono verificarsi senza colpa tua, mentre in SVN devi lavorare su di esso.
Michael Kohne,

3
@DanNeely - CVS li impegna uno per uno. Ecco perché ricevi dei commit parziali: alcuni dei file passano, quindi si interrompe quando ne colpisce uno che non può eseguire il commit (a causa di un conflitto). È il risultato del fatto che CVS è originariamente cresciuto da RCS, credo.
Michael Kohne,

4
Inoltre, nota che con CVS, anche se non si verifica un errore e tutto viene eseguito il commit, qualcuno con una connessione più veloce potrebbe aggiornare il proprio albero dei sorgenti a metà del commit, lasciandoli in uno stato incoerente. (E mi aspetto che i timestamp siano altrettanto distanziati, in modo che provare a controllare l'albero a partire da una data / ora che è caduta nel mezzo di un commit avrebbe risultati simili.)
SamB

15

Questo è spiegato ad esempio nel ciao ciao CVS. Sono stato l' articolo sovvertito scritto da Andy Lester :

Se provo a eseguire il commit in Subversion, ma uno dei file ha un conflitto o non è aggiornato, nessuno dei file si impegna. In CVS, hai una serie di file semi-impegnati che devi correggere subito.

Il fatto che CVS imponga al programmatore di correggere immediatamente l'unione è controproducente. Rispetto a ciò, un'opzione per ritardare / annullare / unire attentamente le modifiche è un vantaggio sostanziale.


Altri vantaggi di SVN rispetto a CVS spiegati nell'articolo precedente sono:

  • Versioni locali di tutto ciò che fai
     
    Se vuoi cvs diff, devi essere in grado di connetterti al tuo repository. Nessuna connessione di rete, nessuna differenza. Subversion archivia copie locali incontaminate di ciò su cui stai lavorando, quindi svn diff funzionerà perfettamente. Vuoi ricominciare? svn revert funziona anche non connesso.

  • Nomi simbolici delle revisioni
     
    HEAD è il nome della punta del bagagliaio in CVS, ma ho sempre voluto poter dire “-r-1 ″ come se potessi tornare indietro ai tempi di PVCS. Con CVS, devo fare un registro cvs su ciò che sto modificando, quindi sottrarre uno. Non è divertente. Con Subversion, posso dire svn diff -r PREV.

  • Rapporti sullo stato reale
     
    In CVS, l'unico modo per vedere se qualcosa sul server è più recente è aggiornare cvs e sperare che qualunque cosa accada non causa alcun conflitto. Con il comando svn status, ottengo lo stato reale, quindi posso vedere se ci sono conflitti PRIMA di fare un aggiornamento.

  • Gestione utile dei conflitti di unione
     
    In CVS, se ci sono conflitti, si ottengono marcatori di conflitto nel file. In Subversion, ottieni marcatori di conflitto, PIÙ una copia del tuo file pre-conflitto originale, PIÙ la versione che è venuta giù dal server, PIÙ la versione che stavi originariamente modificando. Quindi, è necessario svn risolvere esplicitamente nomefile.txt per dire a Subversion che il problema è stato risolto. Non è più necessario ricorrere accidentalmente al CVS con gli indicatori di conflitto ancora presenti.


8

Significa che tutte le modifiche a tutti i file vengono eseguite in una singola transazione, quindi tutte hanno esito positivo o nessuna.

Ciò significa che è meno probabile che venga eseguito il check-in delle modifiche parziali nel repository che causano il fallimento delle build. Puoi ancora far dimenticare alle persone di archiviare tutti i file pertinenti, ma si tratta di un problema di processo piuttosto che di un problema con il sistema di controllo delle versioni.


non è una buona cosa allora? In caso contrario, un commit parziale comporterebbe la mancata sincronizzazione dei file.
Geek,

2
sì, è una buona cosa, i commit parziali sono cattivi
jk.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.