2012-03-31 7 views
57

Ich lief kürzlich git fsck --lost-found auf meinem Repository.Git: Dangling Blobs

ich erwartet hatte ein paar baumelnden verpflichtet, um zu sehen, wo ich zurückgesetzt HEAD hatte.

Aber ich war überrascht über mehrere tausend baumelnden blob Nachrichten wahrscheinlich zu sehen.

Ich glaube nicht, irgendetwas mit meinem Repository falsch ist, aber ich bin neugierig, was diese baumelnden Blobs verursacht? Es gibt nur zwei Leute, die an dem Repository arbeiten, und wir haben nichts Außergewöhnliches getan.

ich nicht denken würde, sie von einer älteren Version einer Datei erstellt wurden, durch einen neuen ersetzt werden, da git brauchen würde auf beiden Blobs zu halten, so dass es Geschichte darstellen kann.

Kommen Sie, daran zu denken, an einem Punkt wir ein sehr großes Verzeichnis (Tausende von Dateien) zum Projekt versehentlich hinzugefügt haben und es dann entfernen. Könnte das die Quelle aller herabhängenden Blobs sein?

Nur auf der Suche nach Einblick in dieses Geheimnis.

Antwort

49

ich das letzte Mal in diesem sah ich auf this thread stolperte, und zwar dieser Teil:

Sie können auch mit baumelnden Gegenstände in Packungen landen. Wenn dieses Paket neu gepackt wird, werden diese Objekte gelockert und schließlich unter der oben genannten Regel abgelaufen. Allerdings glaube ich, dass GC nicht immer alte Packs umpacken wird; es werden neue Packs, bis Sie eine Menge Packs haben, und kombinieren sie dann alle (zumindest das ist, was „gc --auto“ tun, ich mich nicht erinnern, ob nur „git gc“ folgt die gleiche Regel).

So ist es normales Verhalten, und wird schließlich gesammelt, glaube ich.

edit: Per Daniel, können Sie es sofort sammeln von

git gc --prune="0 days" 
+3

, was passieren wird, wenn dieser Blob entfernen ist? – nferocious76

+0

@ nferocious76 dann können Sie keine Dateien retten, die beispielsweise zur Staging-Erstellung hinzugefügt, aber nicht festgeschrieben wurden, und wurden dann entfernt (über rm -f). Sobald der GC ausgeführt wurde, sind die Dateien für immer verloren. –

+0

@DavidBrower Ich sehe danke. So entfernen Sie auch nicht verknüpfte oder nicht referenzierte Dateien. – nferocious76

16

laufen Wenn Sie add eine Datei mit dem Index, der Inhalt dieser Datei zu Git-Objektdatenbank als Blob hinzugefügt werden. Wenn Sie dann reset/rm --cached die Datei, noch die Blobs existieren wird (werden sie Müll das nächste Mal gc laufen gesammelt werden)

Wenn jedoch diese Dateien sind Teil eines begehen und Sie später reset Geschichte entscheiden, dann Die alten Commits sind noch von Git's Reflog erreichbar und werden nur nach einer gewissen Zeit (normalerweise ein Monat, iirc) Müll gesammelt. Diese Objekte sollten jedoch nicht als hängend angezeigt werden, da sie immer noch vom Reflog referenziert werden.

+2

Es ist auch erwähnenswert, dass, wenn Sie eine Datei reparieren und "add" es, der vorherige ein baumelnden Blob in der gleichen Weise wird. (Ich benutze generell die Sequenz: hack away, 'git add',' git diff --cached' und/oder 'git status' bis glücklich, dann' git commit', also bekomme ich eine Menge davon. :-)) – torek

23

Ich war wirklich ungeduldig und verwendet:

git gc --prune="0 days"