2014-09-17 8 views
6

Nehmen wir an, ich habe eine Binärdatei übergeben, dann ein paar Commits später geändert und jetzt habe ich sie in einem neuen Commit geändert.Verwendet Git wieder Blobs?

Aus Neugier, fragte ich mich, ob Git einen neuen Blob dafür erstellt? Oder entdeckt es, dass es in der Geschichte ist und es wiederverwenden? Wenn ja, wie erkennt es das? Checksumme?

Antwort

7

Git wird den gleichen Blob wiederverwenden.

Ich habe einen Test gemacht. Ich habe 3 Commits gemacht. Zuerst übertrage ich eine Binärdatei, dann ändere ich die Binärdatei und begehe sie erneut. Dann überschrieb ich die Datei mit der Original-Binärdatei, die beim ersten Commit verwendet wurde, und überspielte sie erneut.

Der Inhalt der Binärdateien in 1. & 3. Commits sind identisch. Jedes Commit ist der HEAD der folgenden Zweige:

1. Commit: "FIRST". 2. commit: "ZWEITE". 3. commit: "master"

Wenn Sie dann "git cat-file -p FIRST^{tree}" ausführen, wird der Hash-Code der Binärdatei angezeigt.

$ git cat-file -p FIRST^{tree} 
100644 blob ec049240a47b472bd7c31d1fa27118c4fe2f1229 test.db3 
$ git cat-file -p SECOND^{tree} 
100644 blob a47bb3727e5aefe3ec386bec5520f3e4ffb3a4c5 test.db3 
$ git cat-file -p master^{tree} 
100644 blob ec049240a47b472bd7c31d1fa27118c4fe2f1229 test.db3 

Sie werden feststellen, dass der Hash-Code des Blobs des 1. und 3. Commits identisch ist.

git ist so intelligent, dass überprüft werden kann, ob ein Blob für einen Hash-Code existiert und diesen Blob wieder verwendet, falls er gefunden wird.

+2

Dies ist die richtige Antwort. Der Schlüssel hier ist, dass die SHA1, na ja, der "Schlüssel" zu der Datei, in Bezug auf eine Schlüssel/Wert-Datenbank, ist. Die SHA1 ist eine kryptografische Prüfsumme des Inhalts der Datei (plus einige Informationen über eindeutige Daten und Größen). Zwei identische Dateien berechnen die gleiche Prüfsumme und speichern somit ein einzelnes Git-Objekt, dessen Name die SHA-1-Prüfsumme ist. Es spielt keine Rolle, wann die Prüfsumme berechnet wird, sondern nur, ob eine Datei mit dieser Prüfsumme als Name im Repository vorhanden ist. – torek

+1

TIL: git cat-file;) – awendt

+1

@torek: Genau. Intern ist ein Git Repo mehr oder weniger eine Schlüsselwert-Datenbank. Die Schlüssel sind die SHA1-Prüfsummen der Git-Objekte (Commits, Bäume, Blobs und Tags), und der Wert ist das entsprechende Objekt. Die Wiederverwendung von Blobs (und Bäumen) ist eine automatische Folge dieser Struktur. – sleske