Wie zeichnet Git Dateipfade und Namen für ihre Blobs auf (oder zeigt sie eher), und identifiziert sie dann umbenennen?

8

Ich versuche, meinen Kopf so zu verstehen, dass git es schafft, sich den Namen einer Datei und ihren Pfad zu merken, da sie nur Dateiinhalte in einem Blob speichert. Ist die Erklärung in Link hier von Abizem ein guter? (es ist das Beste, was ich bisher gesehen habe)

Die folgende Frage ist, wie bestimmt (where) git dann, wann wir Ähnlichkeit haben, insbesondere nach einem 'move' oder Pfadnamen-Update? (gemäß meinem Q Unterverzeichnis umbenennt ). Ich muss in der Lage sein, einen bestehenden Workflow beizubehalten, der Pfadbenennungen als Teil des privaten VCS auf niedriger Ebene verwendet (wir haben ein großes eisernes VCS für große Releases, aber nichts für den täglichen Gebrauch).

    
Philip Oakley 06.05.2011, 22:38
quelle

2 Antworten

10

git definiert vier Arten von Objekten (Commit, Tag, Tree, Blob). Jedes Objekt wird nach dem Hash seines Inhalts identifiziert.

Die drei Objekte, die an der Umbenennung beteiligt sind, sind:

  1. blob: Dies entspricht einer festgeschriebenen Datei, der Inhalt des Objekts ist der komprimierte Inhalt der ursprünglichen Datei

  2. Baum: Dies entspricht einer Verzeichnisliste, es enthält eine Zuordnung des Dateinamens zu anderen Objekten (entweder Blobs oder Bäume) und zeichnet auch die Zugriffsrechte auf

  3. commit: Dies enthält die Commit-Nachricht, einen Zeiger auf die übergeordneten Commits (mit Ausnahme des ersten Commits) und auf ein Tree-Objekt

Wenn Sie also eine Datei umbenennen und sie festschreiben, wird ein neues Baumobjekt erstellt (gut und mehr als eins, wenn es sich in einem Unterverzeichnis befindet), mit einem neuen Mapping-Namen für das Objekt, aber das Objekt ist das gleiche.

Allerdings verfolgt Git die Umbenennung nicht, sondern versucht, sie durch Vergleichen des Dateiinhalts neu zu entdecken. Wenn zwei Dateien wirklich ähnlich sind, aber unterschiedliche Namen haben, ist es ein Umbenennen. Dies kann zeitaufwendig sein, und wenn es viele Dateien gibt, kann es fehlschlagen.

Bearbeiten: Schau dir das Git Community Book an, das eine wirklich gute Erklärung hat Wie speichert git Informationen?

    
Sylvain Defresne 06.05.2011 22:48
quelle
2

Warum wird git nicht "track" umbenannt?

  

Git muss mit vielen zusammenarbeiten   verschiedene Workflows, zum Beispiel einige   Änderungen können von Patches kommen, wo   Umbenennen von Informationen möglicherweise nicht   verfügbar. Sich auf die explizite Umbenennung verlassen   Tracking macht das Verschmelzen unmöglich   zwei Bäume, die genau das getan haben   dasselbe, außer einem tat es als   patch (create / delete) und man hat es gemacht   eine andere Heuristik verwenden.

     

Auf eine zweite Anmerkung, Tracking-Umbenennungen ist   wirklich nur ein spezieller Fall von Tracking   wie sich Inhalt im Baum bewegt. In einigen   Fälle können Sie stattdessen interessiert sein   beim Abfragen, wenn eine Funktion hinzugefügt wurde   oder in eine andere Datei verschoben. Von nur   verlassen sich auf die Fähigkeit, neu zu erstellen   diese Informationen, wenn nötig, zielt Git   um einen flexibleren Weg zu bieten   Verfolgen Sie, wie sich Ihr Baum verändert.

     

Das bedeutet jedoch nicht, dass Git   hat keine Unterstützung für Umbenennungen. Das diff   Maschinen in Git hat Unterstützung für   automatisch erkennt Umbenennungen, dies   wird durch den '-M' Schalter auf die   git-diff- * Familie von Befehlen. Das   umbenennen Erkennungsmaschinen wird von verwendet   git-log (1) und git-whatchanged (1), so   zum Beispiel wird 'git log -M' geben   den Commit-Verlauf mit Umbenennen   Information. Git unterstützt auch ein   begrenzte Form der Zusammenführung über   benennt um. Die zwei Werkzeuge zum Zuweisen   Schuld, git-Tadel (1) und   Git-Annotate (1) beide verwenden die automatische   Erkennungscode in Track umbenennen   benennt um.

     

Als ganz besonderen Fall, 'git log'   Version 1.5.3 und höher hat "- folgen"   Option, die Sie folgen können   Benennt um, wenn ein einzelner Pfad angegeben wird.   Mail von Linus zu diesem Thema.

     

Git hat einen Umbenennungsbefehl git mv, aber   das ist nur für die Bequemlichkeit. Das   Effekt ist nicht zu unterscheiden von   Entfernen der Datei und Hinzufügen eines anderen   mit anderem Namen und gleichem Namen   Inhalt.

Ich bin überrascht, dass niemand mit Pro Git-Buch verbunden ist. Viele meiner Erkenntnisse sind davon.

Wenn Sie das Buch Version Control with Git erhalten, tun Sie es auch. Es ist ein sehr gutes Buch, besonders für Anfänger.
Hier ist der Link - Versionskontrolle mit Git .
Es gibt auch Git von unten nach oben .

    
manojlds 09.05.2011 15:05
quelle

Tags und Links