git, sichere Methode zum Verschieben / Umbenennen von Dateien unter Beibehaltung des Verlaufs

7

Ich weiß, dass es "viele" Fragen gibt, die ähnlich aussehen, also lass mich sie zusammenfassen, bevor du meine fragst.

Die Antwort auf die erste stimmt mir nicht zu, weil ich das schon mal gemacht habe. Die Antwort auf die zweite Frage ist der Grund, warum ich diese Frage stelle. I.e.,

Ich habe festgestellt, dass ich immer git mv mache, aber manchmal wird es als move / rename behandelt, und manchmal wird es als delete + addition behandelt. Also ich möchte wissen wie ich es immer wieder umziehen / umbenennen kann?

Nehmen Sie dieses Beispiel als Beispiel, unten sehen wir einige Fälle, die Sie verschieben / umbenennen möchten %Code%. Beachten Sie, dass solche Bewegungen über / zwischen den Ordnern sind! Ie.e, ich tat es!

Aber es gibt viele andere Fälle easygenapi/tf-varcaser.go → tf-varcaser.go wurden als delete + addition behandelt, die im genau gleichen Änderungsprotokoll angezeigt werden. Auch hier mache ich git mv die ganze Zeit. Warum verhalten sich git mv anders?

Gibt es eine sichere Möglichkeit, Git-Dateien zu verschieben / umzubenennen und dabei den Verlauf beizubehalten?

    
xpt 25.02.2016, 04:41
quelle

2 Antworten

9

tl; dr; nein

Längere Version: Meiner Erfahrung nach ist Git sehr gut darin, den Umzug / Umbenennen zu erkennen, solange die Datei unverändert ist. Git verwendet Heuristiken, um den Zug zu versuchen und zu lokalisieren. Sie können sich täuschen lassen, wenn Sie mehrere Dateien haben, die zu ähnlich sind, oder wenn die Datei während des Verschiebens geändert wurde, was dazu führt, dass sie sich von ihrem Original unterscheidet.

Der beste Weg, um dies zu tun, ist, mehrstufige Commits zu machen, die alle Ihre Moves in ein Commit aufteilen, gefolgt von den Änderungen in einem anderen. Zum Beispiel ...

%Vor%

Es wird nicht garantiert, dass Ihr Zug korrekt erkannt wird, da es bei mehreren Kandidaten immer noch verwirrend sein kann. Aber es hat sehr gut für mich funktioniert und fängt die Mehrheit der Fälle.

    
Kevin Burdett 25.02.2016, 05:05
quelle
12

Git verfolgt keine Umbenennungen. Zeitraum. Es verfolgt auch keine Adds. Oder löscht. Oder Diffs. Oder Patches. Oder bewegt sich. Oder irgendeine Art von Veränderung, wirklich.

Git ist Snapshot-basiert. Jedes Commit zeichnet einen Snapshot des gesamten Projekts auf. Das ist es. Wie dieser Schnappschuss entstanden ist, weiß Git weder Bescheid noch kümmert er sich.

Diffs, Patches, Adds, Deletes, Moves, Renames, etc. werden von verschiedenen Visualisierungswerkzeugen gezeigt, die sie nachher mit Heuristiken ableiten (was eine andere Art ist, "Raten" zu sagen). Manchmal können sie richtig raten, was Sie getan haben, und manchmal nicht. Es spielt jedoch keine Rolle, denn es ist nur Visualisierung, es ist in keiner Weise, Form oder Form Teil der Geschichte.

Die meisten Tools verwenden eine Form von Ähnlichkeitsmetrik und folgern, dass eine Umbenennung aufgetreten ist, wenn zwei Dateien eine Ähnlichkeit aufweisen, die größer als ein Schwellenwert ist. In einigen Tools ist dieser Schwellenwert konfigurierbar. In einigen Tools ist sogar der Algorithmus konfigurierbar. (Ein etwas ähnliches Beispiel: git diff erlaubt Ihnen, zwischen verschiedenen Algorithmen zu wählen, um Differenzen innerhalb -Dateien abzuleiten.)

Da Git keine Änderungen aufzeichnet, ist es möglich, in späteren Versionen der Visualisierungswerkzeuge neue Änderungen hinzuzufügen, die diese Änderungen aus älteren Commits ableiten können, die aufgezeichnet wurden, bevor die neuen Tools, die neue Arten von Änderungen verstehen, überhaupt geschrieben wurden. Stellen Sie sich zum Beispiel ein Werkzeug vor, das die Syntax und Semantik der von Ihnen verwendeten Programmiersprache versteht. Es könnte ein bestimmtes Commit nicht als ganzes Bündel von Dateien visualisieren, die jeweils ein paar Zeilen geändert haben, sondern als eine einzelne Änderung, die eine Subroutine umbenennt und jede Callsite aktualisiert (dh das Rename Method Refactoring ) / p>

Renames sind eigentlich ein gutes Beispiel dafür. Die von git log --follow verwendeten Umbenennungserkennungsheuristiken und Ähnlichkeitsmetriken wurden zum Beispiel mehrfach verbessert. IIRC, am Anfang wurden Umbenennungen überhaupt nicht abgeleitet, diese Fähigkeit wurde später hinzugefügt. Dies wäre einfach nicht möglich gewesen, wenn Git Änderungen statt Snapshots aufgezeichnet hätte.

    
Jörg W Mittag 25.02.2016 04:53
quelle

Tags und Links