Wie ändert git Dateien intern?

8

Kann jemand erklären, wie git intern weiß, dass sich die Dateien X, Y und Z geändert haben? Was ist der Prozess hinter den Kulissen, der erkennt, wenn eine Datei noch nicht hinzugefügt oder modifiziert wurde? Ich frage, denn mit Subversion ist es einfach herauszufinden, dass es diese Dinge verfolgt, indem es ein .svn -Verzeichnis unter jedem Ordner hat, aber für Git kann ich keine Beschreibung der inneren Funktionsweise finden. Ich bezweifle, dass es alle Unterverzeichnisse nach Änderungen durchsucht, da es ziemlich schnell ist.

Also, wenn Neugier, was ist das innere Funktionieren?

    
carlspring 02.04.2013, 13:27
quelle

4 Antworten

10

Die Mechanismen, mit denen man den Status einer Datei bestimmt, sind ziemlich einfach. Um zu wissen, welche Dateien inszeniert wurden, wird einfach der HEAD Baum mit dem Index verglichen. Alle Elemente, die nur im Index angezeigt werden, wurden zum Hinzufügen bereitgestellt. Alle Elemente, die nur in HEAD angezeigt werden, wurden entfernt und für alle Elemente, die sich unterscheiden, wurden Änderungen bereitgestellt.

Ähnlich würde man nicht gestartete Änderungen feststellen, indem man den Index mit dem Arbeitsverzeichnis unterscheidet.

Ihre Frage im Einzelnen fragt, wie dies so schnell sein kann (schließlich ist die Berechnung des SHA1-Hash einer Datei nicht gerade schnell.) Dies ist, wo der Index - auch bekannt als der Cache - kommt wieder zum spielen. Der Index enthält Felder für die Dateigröße und die Zeit für die Dateiänderung . So kann man einfach stat(2) eine Datei auf Platte speichern und mit der Dateigröße und der Dateiänderungszeit des Index vergleichen, um zu wissen, ob die Datei gehackt werden soll oder nicht.

    
Edward Thomson 02.04.2013, 14:28
quelle
4

Sie finden Ihre Antwort im kostenlosen Buch Pro-Git im Kapitel Git Internals

>

In diesem Kapitel wird erklärt, wie git hinter der Motorhaube funktioniert.

Wie Leo gesagt hat, überprüft git die SHA1 der Dateien, um zu sehen, ob sie sich geändert hat Sie können es so überprüfen (aus Git Internals):

%Vor%

Schreiben Sie dann einen neuen Inhalt in die Datei und speichern Sie ihn erneut:

%Vor%     
stdcall 02.04.2013 13:48
quelle
3

Wenn die Antwort in dem möglichen Duplikat nicht ausreicht, können Sie sich dies ansehen Ссылка

Um es kurz zu machen: Git verwendet den SHA-1 des Dateiinhalts, um Änderungen zu verfolgen. Git verfolgt vier Objekte: einen Blob, einen Baum, ein Commit und ein Tag.

Um Ihre Frage zu beantworten, wie sie Änderungen verfolgt, hier ein Zitat von diesem Link:

  

Das Baumobjekt ist, wie Git Dateinamen und Verzeichnisse verfolgt. Für jedes Verzeichnis gibt es ein Baumobjekt. Das Tree-Objekt zeigt auf die SHA-1-Blobs, die Dateien in diesem Verzeichnis und andere Bäume, Unterverzeichnisse zum Zeitpunkt des Commits. Jedes Tree-Objekt wird in einen SHA-1-Hash seines Inhalts verschlüsselt und in .git / objects gespeichert. Der Name der Bäume, da sie SHA-1-Hashes sind, erlauben es Git, schnell zu sehen, ob irgendwelche Änderungen an Dateien oder Verzeichnissen stattgefunden haben, indem der Name mit dem vorherigen Namen verglichen wird. Ziemlich glatt.

    
Leo Correa 02.04.2013 13:48
quelle
1

Ich fand diesen Artikel sehr hilfreich.

Ссылка

  

Git ist auf einem Graphen aufgebaut. Fast jeder Git-Befehl manipuliert dies   Graph. Um Git tief zu verstehen, konzentrieren Sie sich auf die Eigenschaften davon   Grafik, nicht Workflows oder Befehle.

Extrahieren - Machen Sie ein Commit, das nicht das erste Commit ist

  

Der Benutzer legt den Inhalt von data/number.txt auf 2 fest. Dies aktualisiert die   Arbeitskopie, aber lässt den Index und HEAD fest so wie sie sind.

     

Der Benutzer fügt die Datei zu Git hinzu. Dies fügt ein Blob hinzu, das 2 enthält   Objekte Verzeichnis. Es zeigt den Indexeintrag für data/number.txt an   der neue Blob.

    
rahulroy9202 22.12.2016 06:11
quelle

Tags und Links