2009-06-08 10 views
29

Recentemente il mio computer principale che ho utilizzato per lo sviluppo ha iniziato a surriscaldarsi. Ho iniziato a ricevere 4 o 5 blocchi al giorno. Tutto si blocca. Tutti i miei progetti sono sotto controllo di versione usando git.Integrità file Git

Mi ricordo di aver guardato il discorso di Linus su Google dicendo che git si assicurerà che i file non siano corrotti. Nella mia situazione è sicuro assumere che git mi avvertirà se uno dei file sorgente viene corrotto.

Il sistema operativo è Mac OS X 10.4 è HFS +.

risposta

36

È possibile forzare Git a controllare l'intero repository con git fsck. Se un repository Git viene danneggiato, si dovrebbe ottenere un nuovo clone da un repository non danneggiato.

Sotto il normale funzionamento Git dovrebbe controllare parti del repository come sono letti, quindi potrebbe richiedere più tempo per notare una certa corruzione, ma sarà essere notato la prima volta che si tenta di accedere ai dati corrotti.

+5

Cosa succede se cercare di spingere a distanza? Prima di notare la corruzione, corrompe anche il telecomando o si lamenta di ciò? –

+5

La spinta al telecomando implica il raggruppamento di tutti i file insieme e il ricevitore (dove si preme a) deve ricalcolare gli SHA1 di tutti i file. Quindi se un file è stato corrotto in qualche modo, gli ID degli oggetti negli alberi avrebbero iniziato a non corrispondere e il danneggiamento si sarebbe manifestato --- e puoi sempre tornare al punto in cui ti trovavi prima e fare un git fsck per trovare i problemi dalla tua parte . – araqnid

+5

Infine, i file degli oggetti sono immutabili, quindi una volta scritti, non hanno mai cambiato il loro contenuto. L'unica operazione che si verifica è il reimballaggio, quindi non è possibile corrompere il telecomando premendo perché non scriverà un'altra copia di un file che già possiede. –

9

Cosa Linus intendeva quando ha detto che Git garantisce i file non siano danneggiati, si riferiva al fatto che, quando si fa riferimento a un particolare commit (identificata dal suo hash), si è garantito che sarà sempre fare riferimento allo stesso identico stato del repository. Se tu e tiri il kernel linux dall'albero di Linus, e si riferisce ad alcuni commit ae6bcd1 ..., non c'è nulla che tu possa fare (anche nel tuo repository locale) per fare mai commit ae6bcd1 ... sembra diverso dal impegno che Linus sta guardando quando si riferisce ad esso.

Inoltre, poiché un oggetto commit contiene riferimenti a (tutti) i suoi commit parent, quando si fa riferimento a un commit, si garantisce anche la sua cronologia completa nel DAG.

Per quanto riguarda la corruzione dei file, è una sorta di questione indipendente; ma senza corrompere gli oggetti blob effettivi (ad esempio .git/objects/ob/ject_hashname) se uno dei file dell'albero di lavoro viene danneggiato, sarà possibile ripristinare da uno stato di commit precedente o da uno stato di indice/cache.

In questo caso non sarà mai possibile corrompere un telecomando a meno che non si stiano facendo push forzati (che sovrascrivono la cronologia sui telecomandi), poiché push assicura che gli oggetti di commit formino un grafico cronologico continuo.

+0

Fondamentalmente, appena provo a spingere un repo corrotto, mi avviserà e posso sempre clonare nuovamente il mio repo ed essere al sicuro. –

6

Recentemente ho dovuto verificare le pronti contro termine su un server che sono caduto, ho usato il seguente comando:

for gitdir in $(sudo find/-name ".git" -type d -printf "%h "); do 
    cd $gitdir && (git fsck && echo "${gitdir} - "'HAPPY !') \ 
    || echo "${gitdir} - "'ERROR !'; 
done