Git verfolgt Dateiinhalte, keine Dateinamen. Das Umbenennen einer Datei ohne Änderung ihres Inhalts ist für Git also leicht zu erkennen. (Git verfolgt nicht, führt aber eine Erkennung durch ; verwendet git mvoder git rmund git addist praktisch gleich.)
Wenn eine Datei zum Repository hinzugefügt wird, befindet sich der Dateiname im Baumobjekt. Der eigentliche Dateiinhalt wird als binäres großes Objekt ( Blob ) im Repository hinzugefügt . Git fügt keinen weiteren Blob für zusätzliche Dateien hinzu, die denselben Inhalt enthalten. Tatsächlich kann Git dies nicht, da der Inhalt im Dateisystem gespeichert ist, wobei die ersten beiden Zeichen des Hash der Verzeichnisname und der Rest der Name der darin enthaltenen Datei sind. Um Umbenennungen zu erkennen, müssen Hashes verglichen werden.
Um kleine Änderungen an einer umbenannten Datei zu erkennen, verwendet Git bestimmte Algorithmen und einen Schwellenwert, um festzustellen, ob es sich um eine Umbenennung handelt. Schauen Sie sich zum Beispiel die -MFlagge für an git diff. Es gibt auch Konfigurationswerte wie merge.renameLimit(die Anzahl der Dateien, die bei der Umbenennungserkennung während einer Zusammenführung berücksichtigt werden müssen).
Um zu verstehen, wie git ähnliche Dateien behandelt (dh welche Dateiumwandlungen als Umbenennungen betrachtet werden), untersuchen Sie die verfügbaren Konfigurationsoptionen und Flags wie oben erwähnt. Sie müssen nicht mit dem Wie berücksichtigt werden. Um zu verstehen, wie Git diese Aufgaben tatsächlich ausführt, sehen Sie sich die Algorithmen zum Auffinden von Textunterschieden an und lesen Sie den Git-Quellcode.
Algorithmen werden nur für Diff-, Merge- und Protokollzwecke angewendet - sie haben keinen Einfluss darauf, wie Git sie speichert. Jede kleine Änderung des Dateiinhalts bedeutet, dass ein neues Objekt hinzugefügt wird. Auf dieser Ebene findet kein Delta oder Diff statt. Natürlich können die Objekte später dort verpackt werden, wo Deltas in Packdateien gespeichert sind, aber das hängt nicht mit der Umbenennungserkennung zusammen.