2015-04-23 10 views
6

Welchen Algorithmus Git verwendet, um festzustellen, dass einige Datei umbenannt wurde?Woher weiß Git, dass die Datei umbenannt wurde?

Dies ist, was git status vor nur wenige Minuten produziert:

enter image description here

Informationen mit gelben Kasten markiert ist falsch. Es gab tatsächlich keine solche Umbenennung. Die Dateien views/file/create.php und views/file/index.php wurden wirklich halbe Stunde gelöscht, nachdem ein komplett neuer Satz von zwei Dateien - views/logo/create.php und views/logo/index.php erstellt wurde.

Beide Dateien können scheinen (Git) ziemlich ähnlich, aber die Tatsache bleibt - diese sind nicht die gleichen, umbenannten Dateien. Dies ist eine komplett neue Gruppe von Dateien, die etwa eine halbe Stunde vor dem Löschen der ersten Dateien in einem anderen Verzeichnis erstellt wurde.

Da die von Git gelieferten Informationen nicht korrekt sind, möchte ich meine Neugier füttern und darum frage ich.

+0

Ich stimme dem Flosculus zu und möchte nur einen Artikel hinzufügen, der etwas detaillierter in die Algorithmen zur Ähnlichkeitserkennung eingeht. – wonderb0lt

+1

Schön! Vier Upvotes und 1 Star innerhalb von 2-3 Minuten, auf eine Frage, das ist ein perfekter Dupe! :> Ich liebe SE Gemeinschaft. Und ... oops ...Entschuldigung dafür, ein Autor dieses Betrogenen zu sein, aber mein Google wurde gerade mit kaltem Kaffee überschwemmt! – trejder

Antwort

6

Von Wikipedia:

Benennt sind eher implizit als explizit behandelt. Eine häufige Beschwerde mit CVS ist, dass es den Namen einer Datei verwendet, um seine Revisionshistorie zu identifizieren, so Verschieben oder Umbenennen einer Datei ist nicht möglich, ohne entweder seine Geschichte zu unterbrechen, oder die Geschichte umbenennen und dabei machen die Geschichte ungenau. Die meisten Post-CVS-Versionskontrollsysteme lösen dies, indem sie einer Datei einen eindeutigen langlebigen Namen (eine Art Inode Nummer) geben, der das Umbenennen überlebt. Git notiert keinen solchen Identifizierer, und dies wird als ein Vorteil beansprucht. [34] [35] Quellcode Dateien werden manchmal aufgeteilt oder zusammengeführt, sowie einfach umbenannt, [36] und dies als eine einfache Umbenennung aufzuzeichnen würde eine ungenaue Beschreibung von dem, was passiert in der (unveränderlichen) Geschichte. Git-Adressen das Problem durch Erkennen von Umbenennungen beim Durchsuchen des Verlaufs von Snapshots , anstatt es beim Erstellen des Snapshot aufzuzeichnen. [37] () Kurz gesagt, eine Datei in Revision N, eine Datei mit dem gleichen Namen in der Revision N-1 ist seine Standard-Vorgänger. Wenn es jedoch keine gleichnamige Datei in Revision N-1 gibt, sucht Git nach a Datei, die nur in Revision N-1 existierte und ist der neuen Datei sehr ähnlich.) Allerdings erfordert es mehr CPU-intensive Arbeit jedes Mal Geschichte überprüft wird, und eine Nummer von Optionen, um die Heuristiken anzupassen. Dieser Mechanismus funktioniert nicht immer ; manchmal wird eine Datei, die mit Änderungen in demselben Commit umbenannt wird, als ein Löschen der alten Datei und das Erstellen einer neuen Datei gelesen. Entwickler können diese Einschränkung umgehen, indem sie die Umbenennung festschreiben und separat ändern.

Verwandte Themen