Während des ersten Klons eines Repositorys empfängt git zuerst die Objekte (was offensichtlich genug ist) und verbringt dann ungefähr die gleiche Zeit damit, "Deltas aufzulösen". Was passiert eigentlich in dieser Phase des Klons?
Während des ersten Klons eines Repositorys empfängt git zuerst die Objekte (was offensichtlich genug ist) und verbringt dann ungefähr die gleiche Zeit damit, "Deltas aufzulösen". Was passiert eigentlich in dieser Phase des Klons?
Antworten:
Git verwendet Delta-Codierung , um einige der Objekte in Packdateien zu speichern. Allerdings wollen Sie nicht jede einzelne Änderung wiedergeben haben jemals auf einer bestimmten Datei, um die aktuelle Version zu erhalten, so Git auch gelegentliche Schnappschüsse der Dateiinhalte gespeichert außerdem hat. "Auflösen von Deltas" ist der Schritt, mit dem sichergestellt wird, dass all dies konsistent bleibt.
Hier ist ein Kapitel aus dem Abschnitt "Git Internals" des Pro Git-Buches, das online verfügbar ist und darüber spricht.
git gc
oder wann immer Git dies für erforderlich hält) komprimiert Git alle "losen" Dateien in eine Packdatei, um Platz zu sparen, und eine Indexdatei in dieser Packdatei wird erstellt. Zlib wird also mit einem eigenen Delta-Algorithmus komprimiert, aber Git verwendet Delta-Codierung, um frühere Versionen zu speichern. Da der häufigste und häufigste Zugriff die neueste Version ist, wird diese als Momentaufnahme gespeichert.
Die Stufen von git clone
sind:
"Auflösen von Deltas" ist die Meldung, die für die zweite Stufe angezeigt wird, in der die Pack-Datei indiziert wird ("git index-pack").
Pack-Dateien enthalten nicht die tatsächlichen Objekt-IDs, sondern nur den Objektinhalt. Um festzustellen, wie die Objekt-IDs lauten, muss git für jedes Objekt im Paket eine Dekomprimierung + SHA1 durchführen, um die Objekt-ID zu erstellen, die dann in die Indexdatei geschrieben wird.
Ein Objekt in einer Packdatei kann als Delta gespeichert werden, dh als eine Folge von Änderungen, die an einem anderen Objekt vorgenommen werden müssen. In diesem Fall muss git das Basisobjekt abrufen, die Befehle anwenden und das Ergebnis SHA1. Das Basisobjekt selbst muss möglicherweise durch Anwenden einer Folge von Delta-Befehlen abgeleitet werden. (Obwohl im Fall eines Klons das Basisobjekt bereits angetroffen wurde, ist die Anzahl der hergestellten Objekte im Speicher begrenzt.)
Zusammenfassend lässt sich sagen, dass in der Phase "Auflösen von Deltas" die gesamte Repo-Datenbank dekomprimiert und überprüft wird, was nicht überraschend lange dauert. Vermutlich dauert das Dekomprimieren und Berechnen von SHA1s tatsächlich länger als das Anwenden der Delta-Befehle.
Im Falle eines nachfolgenden Abrufs kann die empfangene Packdatei Verweise (als Delta-Objektbasen) auf andere Objekte enthalten, über die der empfangende Git voraussichtlich bereits verfügt. In diesem Fall schreibt der empfangende Git die empfangene Pack-Datei tatsächlich neu, um solche referenzierten Objekte einzuschließen, so dass jede gespeicherte Pack-Datei autark ist. Hier könnte die Meldung "Auflösen von Deltas" entstanden sein.
Amber scheint das Objektmodell zu beschreiben, das Mercurial oder ähnliches verwendet. Git speichert nicht jedes Mal die Deltas zwischen nachfolgenden Versionen eines Objekts, sondern vollständige Snapshots des Objekts. Anschließend werden diese Snapshots mithilfe der Delta-Komprimierung komprimiert, wobei versucht wird, gute Deltas zu finden, die verwendet werden können, unabhängig davon, wo in der Historie diese vorhanden sind.