Frage zu git
-
Hallo,
hier wird gleich zu Anfang versucht den Unterschied zwischen git und anderen VCS zu erklären:
http://git-scm.com/book/en/Getting-Started-Git-BasicsWährend SVN z. B. immer deltas zu anderen Dateien speichert, macht git Snapshots und verweist auf gleiche Dateien, falls sie sich geändert haben.
Dies scheint mir nun nicht wirklich anders zu sein als bei SVN, nur, dass die Grafik etwas anders aufgemalt wurde.Kann mir das jemand genauer erklären?
L. G.
Steffo
-
Um alle Delta's abzuarbeiten, musst du mit der initialen Version beginnen, dann alle Delta's darauf anwenden bzw. patchen. Git hat dagegen immer einen aktuellen Snapshot, ohne alle vorherigen Delta's abarbeiten zu müssen.
Sprich: weniger Aufwand.Gruß Kimmi
-
Danke, für deine Antwort!
Also speichert git immer vollständige Dateien, es sei denn eine identische Version existiert schon bei einem alten Snapshot?Wie macht das SVN? Letztendlich habe ich auf meinem Working Directory in SVN auch nur eine einzige Datei. Wird diese zusammengestellt, wenn ich ein svn update mache?
L. G.
Steffo
-
Steffo schrieb:
Also speichert git immer vollständige Dateien, es sei denn eine identische Version existiert schon bei einem alten Snapshot?
Nein, das wäre sehr verschwenderisch. git speichert auch Deltas, wenn es sich anbietet. Das ist aber nur eine Optimierung, du bekommst die Deltas nie zu sehen. Die Deltas sind auch normalerweise nicht die diffs, die du dir anschaust.
Die "snapshots" in git sind ein Konzept, das dem Nutzer präsentiert wird. Intern wird das so speicher-sparend implementiert, dass tatsächlich nur die Änderungen Speicher kosten, nicht Datei-Teile, die gleichgeblieben sind.
-
Und wo ist jetzt der Unterschied zu svn?
Beide speichern deltas und bei beiden ist das für den Benutzer nicht sichtbar.EDIT: Ich bin übrigens in keiner kleinkarierten Phase, sondern das ist prüfungsrelevant. Ich muss den Unterschied wissen!
-
Also im internet gibts soviel ...
z.B.
http://boxysystems.com/index.php/5-fundamental-differences-between-git-svn/
-
Das beantwortet meine Frage nicht.
Meine Frage bezog sich auf den Unterschied zwischen den deltas von SVN und den Snapshots von git. Wenn git auch deltas macht, wo ist dann da noch der Unterschied?
-
Ich denke, der Fokus liegt darauf, was denn vordergründig getan wird.
Svn speichert wohl ausschließlich und immer Deltas, git am Anfang hauptsächlich BLOBs (die Dateien direkt), nur periodisch, oder durch [courier]git gc[/courier] angestoßen, werden Deltas intern generiert.
Vergleiche es doch bei Git mit einer Architektur, die aus Cache und Archiv besteht. Die neuesten* BLOBs werden erstmal in ihrer Urform zwischengespeichert. Periodisch oder bei Auftrag werden dann diejenigen, die schon älter sind (und wahrscheinlich auch nur die, die selten benötigt wurden), archiviert; aus ihnen werden also Deltas gemacht, die dann an ihre Stelle treten und bei Bedarf wahrscheinlich wieder zurückgewandelt werden.Wobei ich mir gar nicht vorstellen kann, dass Svn wirklich ausschließlich Deltas benutzt. Das wäre bei lang existierenden Projekten ziemlich unklug, weil der Aufwand, die Enddateien aus ihnen zu erzeugen, mit der Anzahl der Zwischenstände ja doch erheblich steigen würde.
Diskleimer: Ich weiß nicht, was Svn tatsächlich intern tut, ich habe nur die Antworten nochmal anders wiederholt.
-
Lesestoff: http://git-scm.com/book/en/Git-Internals-Git-Objects
So wie ich das verstanden habe: Git speichert die ganze Datei in Blobs. Jedesmal. Außerdem speichert es Trees, die selbst wieder eine mehrere Blobs oder andere trees enthalten. Und zuletzt noch commits, die einen tree und ein paar weitere Infos (parent-commit, autor, Zeit, etc.) enthalten.
Der Key des jeweiligen Objekts ist der sha-1 über den Inhalt. So spart man sich das doppelte Ablegen von Dateien und commits
-
Ich habe was interessantes gefunden:
http://git-scm.com/book/en/Git-Internals-PackfilesAm Anfang wird nur mit Kompression gearbeitet. D. h., für jede Version gibt es eine eigene Datei. Wenn es zu viele Versionen gibt ("loose Objects"). Wird ein Pack- und ein Index-File generiert. Das Pack-File fasst mehrere Objekte zusammen und das Index-File enthält Offsets zu dem Index-File.
Ziemlich genial.