Wie erkennt git ähnliche Dateien für die Umbenennungserkennung?

91

Wikipedia erklärt die automatische Umbenennungserkennung:

Kurz gesagt, bei einer Datei in Revision N ist eine gleichnamige Datei in Revision N - 1 ihr Standardvorfahr. Wenn jedoch in Version N-1 keine gleichnamige Datei vorhanden ist, sucht Git nach einer Datei, die nur in Version N-1 vorhanden war und der neuen Datei sehr ähnlich ist .

Die Umbenennungserkennung läuft anscheinend auf eine ähnliche Dateierkennung hinaus. Ist dieser Algorithmus irgendwo dokumentiert? Es wäre schön zu wissen, welche Arten von Transformationen automatisch erkannt werden.

Mahemoff
quelle

Antworten:

92

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.

Manojlds
quelle
55
"Sie müssen nicht mit dem Wie berücksichtigt werden." - Ich dachte das wäre die Frage?
Bain
2

Es gibt viele Algorithmen, die Ähnlichkeiten zwischen Texten erkennen, und Versionskontrollsysteme verwenden diese häufig bereits, um nur den Unterschied zwischen zwei Versionen zu speichern. Tools wie WinMerge sind intelligent genug, um Unterschiede auch innerhalb von Zeilen zu erkennen. Daher sehe ich keinen Grund, warum diese Algorithmen für diese Umbenennungserkennung nicht verwendet werden.

Hier finden Sie eine Diskussion über Algorithmen zum Erkennen ähnlicher Texte . Einige dieser Algorithmen sind möglicherweise für natürliche Sprachen optimiert, während andere für den Quellcode besser funktionieren, aber im Wesentlichen sind sie sich sehr ähnlich.

GolezTrol
quelle