Was sind die "losen Objekte", auf die sich die Git-GUI bezieht?

219

Wenn ich die Git-GUI öffne , wird eine Popup-Nachricht angezeigt, auf die verwiesen wird loose objects. Ich habe es getan git gcund das hat die Nachricht entfernt.

Was ist loose objectsund wie kann ich verhindern, dass dies erneut auftritt?

Oxo
quelle
Sie können einfach in der Popup-Nachricht auf "Ja" klicken, wenn Sie gefragt werden, ob die losen Objekte jetzt verpackt werden sollen. Die Git-GUI wird git gcfür Sie ausgeführt, mit einer schönen GUI-Fortschrittsanzeige (obwohl sie die meiste Zeit als festgefahren angezeigt wird).
ADTC

Antworten:

144

Ein Objekt (Blobs, Bäume und Commits) mit SHA say - 810cae53e0f622d6804f063c04a83dbc3a11b7ca wird unter gespeichert

.git/objects/81/0cae53e0f622d6804f063c04a83dbc3a11b7ca

(Die Aufteilung in die ersten beiden Zeichen zur Verbesserung der Leistung des Dateisystems, da jetzt nicht alle Objekte im selben Verzeichnis gespeichert sind.)

Objekte, die wie oben gespeichert sind, werden als lose Objekte bezeichnet.

Wenn Sie mit Ihrem Repo beginnen, haben Sie meistens lose Gegenstände. Wenn die Anzahl hoch wird, wird sie ineffizient und sie werden in einer Packdatei gespeichert. Solche Objekte werden gepackte Objekte genannt.

 git gc

wird ausgeführt, um Objekte zu packen (Normalerweise werden auch lose Objekte entfernt, die nicht benötigt werden und einige Wochen alt sind. Mit der --prune=<date>Option können Sie das Entfernen loser Objekte erzwingen, die nicht mehr benötigt werden. Zum Beispiel, wenn Sie ein Commit ändern. Das alte Commit-Objekt ist no länger benötigt.)

Manojlds
quelle
3
Die --pruneOption ist standardmäßig aktiviert. Da sie git gcautomatisch durch die allgemeine Verwendung ausgelöst wird (z. B. commit), müssen Sie sich darüber normalerweise keine Gedanken machen. Ich benutze keine Git-GUI und kann nicht genau finden, wo sie in der Quelle ausgelöst wird, aber entweder führt sie eine eigene Überprüfung durch oder fängt nur die gcdurch einen aufgerufenen Befehl ausgelösten ab. Es ist jedoch sicherlich kein Grund zur Sorge, nur durch den normalen Gebrauch verursacht.
Cascabel
21
Gibt es Nachteile beim Verpacken loser Gegenstände? Wenn nicht, warum macht Git das nicht automatisch?
Louis Rhys
13
Ich denke nicht, dass es wahr ist, dass es automatisch passiert. Ich begebe mich oft, aber 'git gui' erwähnte 50.000 lose Objekte (und habe mich gefragt, warum git so verdammt langsam war, großes Projekt über ~ 4 Jahre ohne manuelles gc)
Kevin
1
@ Kevin Hat sich die Leistung Ihres großen Projekts nach der git gcmanuellen Ausführung verbessert ? Ich denke, es sollte sich verbessern, weil lose Objekte ineffizient sind und 50.000 eine sehr große Zahl sind. Ich fand auch heraus, dass das Packen den vom .gitOrdner belegten Speicherplatz erheblich reduziert .
ADTC
3
@LouisRhys, "Wenn Objekte auf die Festplatte geschrieben werden, liegt sie häufig im losen Format vor, da der Zugriff auf dieses Format kostengünstiger ist. Schließlich möchten Sie jedoch Platz sparen, indem Sie die Objekte zusammenpacken" - aus Git Book Link in Antwort unten
Chris
39

Das Git-Buch erklärt es ziemlich gut: https://git-scm.com/book/en/v2/Git-Internals-Packfiles

Lose Objekte sind das einfachere Format. Es sind einfach die komprimierten Daten, die in einer einzelnen Datei auf der Festplatte gespeichert sind. Jedes Objekt, das in eine separate Datei geschrieben wird.

Mohamed Mansour
quelle