Git: che cos'è un commit / blob penzolante e da dove provengono?


148

Sto cercando le informazioni di base su commit e BLOB penzolanti.

Il mio repository sembra a posto. Ma ho corso git fsckper la prima volta a vedere cosa faceva e ho una lunga lista di "blob penzolanti" e un unico "commit penzolante".

Cosa sono queste cose? Da dove vengono? Indicano qualcosa di insolito (buono o cattivo) sullo stato del mio repository?

Risposte:


95

Durante il lavoro con il repository git, è possibile che si finisca il backup delle operazioni e si eseguano altre mosse che causano BLOB intermedi e persino alcune cose che Git fa per evitare la perdita di informazioni.

Alla fine (condizionatamente, secondo la pagina man di git gc ) eseguirà la garbage collection e pulirà queste cose. È anche possibile forzare invocando il processo di garbage collection, git gc.

Per ulteriori informazioni a riguardo, consultare Manutenzione e recupero dati sul sito git-scm.

Un'esecuzione manuale di GC partirà di default 2 settimane prima dell'esecuzione di questo comando di una rete di sicurezza. È in effetti incoraggiato a eseguire il GC occasionalmente per aiutare a garantire un uso efficace del proprio repository git. Come ogni cosa, però, dovresti capire cosa sta facendo prima di distruggere quelle cose che potrebbero essere importanti per te.


10
Quindi è giusto dire che 1) se non penso che ci sia qualcosa di sbagliato nel mio repository, è sicuro rimuoverli con git gc, e 2) Non ho bisogno di preoccuparmene perché questi bit penzolanti sono normali e già git gestirli?
doub1ejack,

7
Sarebbe una valutazione equa.
vgoff,

9
Inoltre, ogni volta che 'aggiungi' un file, ma non esegui il commit della versione esatta del file, finisci con un blob penzolante. Niente di cui preoccuparsi.
canton7,

7
doub1ejack - In generale, non dovresti eseguire manualmente la garbage collection. È una cattiva abitudine entrare e git fa comunque la raccolta dei rifiuti quando necessario. Lo svantaggio di eseguirlo manualmente è che hai perso la possibilità di recuperare BLOB penzolanti e ti impegni che potresti non voler ora ma che potresti desiderare in futuro. Una volta che esegui la garbage collection, togli da Git alcune funzionalità di ripristino abbastanza potenti. Usare con cautela e come eccezione, non la regola. --- Lascia che git faccia la sua cosa.
Elia Lynn,

95

Dangling blob = Una modifica che è arrivata all'area / indice di gestione temporanea ma non è mai stata impegnata. Una cosa che è sorprendente con git è che una volta aggiunto all'area di gestione temporanea, puoi sempre recuperarlo perché questi BLOB si comportano come commit in quanto hanno anche un hash !!

Dangling commit = Un commit a cui non è direttamente collegato alcun commit secondario, ramo, tag o altro riferimento. Puoi riaverli anche tu!


5
Gli "antenati" dovrebbero leggere "discendenti"? In generale, non puoi raggiungere alcun commit git tramite i suoi antenati.
Phil Miller,

@Novelocrat Ho avuto lo stesso pensiero, sono d'accordo che probabilmente dovrebbe leggere i discendenti.
stkent,

1
Ho ancora letto "ascendenti" nella tua risposta. Sembra che la tua edizione del 2 luglio non abbia corretto l'errore di battitura.
Iclman,

Come si ottiene una chiazza penzolante?
Ciao Arrivederci

1
@ElijahLynn Hai ragione. Penso di aver letto un po 'troppo velocemente le discussioni. Un commit pendente non ha alcun discendente / figlio e non è referenziato da un tag o ramo.
Iclman,

44

HOWTO rimuove tutti i commit penzolanti dal tuo repository git da http://www.tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git-repository/

git reflog expire --expire=now --all
git gc --prune=now

Assicurati di volerli rimuovere davvero, dato che potresti decidere di averne bisogno dopo tutto.


5
In realtà, la maggior parte degli utenti non dovrebbe mai averne bisogno e se lo fanno è probabilmente per un caso d'uso programmatico. Lo spazio su disco risparmiato o la velocità aumentata rimuovendo i commit penzolanti non vale la pena secondo me.
Elijah Lynn

1
Questo risponde a una domanda diversa.
Elijah Lynn,

5

Un commit penzolante è un commit che non è associato al riferimento, cioè non c'è modo di raggiungerlo.

Ad esempio, considera il diagramma seguente. Supponiamo di eliminare il ramo featureX senza unire le sue modifiche, quindi il commit D diventerà un commit pendente perché non è associato alcun riferimento. Se fosse stato unito in master, HEAD e riferimenti master avrebbero indicato il commit di D e non sarebbero più appesi, anche se avessimo eliminato featureX. Leggi la nota dopo il diagramma per capirlo meglio.

Git raccoglie automaticamente i rifiuti (ovvero elimina) i commit sospesi. Possiamo usare il git reflogper recuperare un ramo (di commit penzolanti) che è stato eliminato senza unirlo. Possiamo recuperare i commit cancellati solo se è presente nell'archivio oggetti locale. Se è stata raccolta spazzatura, non possiamo recuperarla.

inserisci qui la descrizione dell'immagine

NOTA che un nome di ramo, ad esempio un'etichetta di ramo, è in realtà un riferimento all'ultimo commit su un ramo, ovvero la punta del ramo. Nel diagramma sopra, featureX, master e HEAD sono solo riferimenti a commit specifici. Le etichette featureX e master si riferiscono agli ultimi commit nelle rispettive filiali. HEAD si riferisce generalmente alla punta del ramo attualmente estratto (master in questo caso). Se esegui il checkout di un commit più vecchio sul tuo ramo corrente, HEAD sarà in uno stato distaccato, ovvero punterà al commit più vecchio anziché a quello più recente. Si noti inoltre che HEAD è chiamato riferimento simbolico perché in realtà punta all'etichetta del ramo corrente e qualsiasi etichetta di ramo punta sempre alla punta del ramo. Quindi, in circostanze normali, HEAD indica indirettamente l'ultimo commit.

A parte, nota che Git rappresenta il suo grafico / cronologia di commit come un grafico aciclico diretto . Ogni commit ha un riferimento ad esso padre. Quindi, le frecce in un diagramma di commit puntano da commit figlio a commit parent. Abbiamo bisogno di un riferimento all'ultimo commit figlio per raggiungere i commit più vecchi in una filiale.

PS - Il diagramma e la comprensione sopra riportati sono stati ottenuti da questo corso gratuito . Anche se il corso è piuttosto vecchio, la conoscenza è ancora rilevante.

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.