2011-12-05 14 views
10

Quando gioco con git, a volte provo cose, quindi annullo comandi che richiedono troppo tempo (ad esempio alcuni comandi git svn che si bloccano durante i problemi di rete). Questo mi ha fatto riflettere:Un repository git può essere danneggiato se un comando che lo modifica si arresta in modo anomalo o viene interrotto?

È sempre sicuro interrompere forzatamente un comando (Ctrl-C o kill)? Cosa succede se un comando si blocca (memoria insufficiente, bug, problema di rete/FS)? Le modifiche del repository sono "transazionali" nel senso che le modifiche incomplete vengono "ripristinate" (come in un filesystem di versioni)? O rischio la corruzione del repository in quel caso?

Sono sicuro che le persone intelligenti che lavorano su git devono averne tenuto conto, tuttavia non sono riuscito a trovare alcuna informazione nel manuale di git o online.

risposta

9

Il repository è completamente transazionale, sì.

L'albero di lavoro è quasi transazionale, ma c'è un caso d'angolo che non può essere facilmente affrontato. Checkout esegue tutti i controlli necessari e scrive il nuovo contenuto in file temporanei e durante il tempo, nulla viene modificato se lo si interrompe. Ma poi rinominerà i file nell'albero uno per uno e aggiorna infine l'HEAD ref e l'interruzione in quella fase può lasciarti con modifiche parziali apportate all'albero. Non è possibile rinominare la massa per consentire di farlo atomicamente.

+0

Avete un riferimento (fonti git o documentazione) che il repo e l'azione push sono transazionali? –

Problemi correlati