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).
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:
blob: Dies entspricht einer festgeschriebenen Datei, der Inhalt des Objekts ist der komprimierte Inhalt der ursprünglichen Datei
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
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?
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 .
Tags und Links git