Ich bin relativ neu in Git, ich habe Subversion schon einmal benutzt.
Mir ist aufgefallen, dass die meisten grafischen Git-Frontends und IDE-Plugins den Verlauf einer Datei nicht anzeigen können, wenn die Datei umbenannt wurde. Wenn ich benutze
git log --follow
In der Befehlszeile kann ich das gesamte Protokoll über Umbenennungen hinweg sehen.
Laut Linus Torvalds ist der --follow-Schalter ein "SVN noob" -Lustiger, ernsthafte Git-Benutzer verwenden ihn nicht:
--follow ist ein totaler Hack, der nur Ex-SVN-Benutzer zufriedenstellen soll, die sowieso nie etwas über Dinge wie Elternschaft oder nette Revisionsgraphen gewusst haben.
Es ist nicht ganz grundlegend, aber die aktuelle Implementierung von "--follow" ist wirklich eine schnelle Vorverarbeitung, die mit der Revisionslauflogik verknüpft ist, anstatt etwas wirklich Integrales zu sein.
Es wurde buchstäblich als "SVN Noob" -Lustiger entworfen, nicht als "echte Git-Funktionalität". Die Idee war, dass Sie sich von der (gebrochenen) Denkweise lösen würden, die Materie im großen Ganzen umbenennt.
Meine Frage : Wie erhalten die Hardcore-Git-Benutzer unter Ihnen den Verlauf einer Datei, als sie umbenannt wurde? Was ist der "echte" Weg, dies zu tun?
git mv oldfile newfile
verursacht keine der Umbenennungs aufgezeichnet werden überhaupt - es ist genau das gleiche wie eine Datei zu löschen und eine andere hinzufügen. git arbeitet nur bei jedem Commit nachträglich Umbenennungen und Kopien aus dem Status des Baums aus./bin/mv oldfile newfile
) umbenennen , dies aber tungit add newfile; git rm oldfile
, ist das Ergebnis nicht von dem von zu unterscheidengit mv oldfile newfile
.git log --follow
verbessert sich ein bisschen mit Git 2.9 (Juni 2016): siehe meine Antwort unten--color-moved
wenn Siediff
.Antworten:
Ich denke, dass der allgemeine Antrieb hinter Linus Point darin besteht, dass Hardcore-Git-Benutzer sich - und das mit einer Prise Salz - niemals um den Verlauf einer "Datei" kümmern. Sie legen Inhalte in einem Git-Repository ab, da der gesamte Inhalt einen aussagekräftigen Verlauf hat.
Ein Umbenennen von Dateien ist ein kleiner Sonderfall, bei dem sich "Inhalt" zwischen Pfaden bewegt. Möglicherweise haben Sie eine Funktion, die zwischen Dateien wechselt, die ein Git-Benutzer möglicherweise funktional mit "Spitzhacke" aufspürt (z
log -S
. B. ).Andere "Pfad" -Änderungen umfassen das Kombinieren und Teilen von Dateien; git ist es egal, welche Datei Sie als umbenannt betrachten und welche Sie als kopiert (oder umbenannt und gelöscht) betrachten. Es verfolgt lediglich den gesamten Inhalt Ihres Baums.
git regt zum "Ganzbaum" -Denken an, bei dem ebenso viele Versionskontrollsysteme sehr dateizentriert sind. Aus diesem Grund bezieht sich git häufiger auf "Pfade" als auf "Dateinamen".
quelle
--follow
diese?--follow
die Standardeinstellung verbessert wird . Was ich meine ist, wenn ich den Verlauf des Codes in einer Datei sehen möchte, ist es mir normalerweise egal, ob die Datei umbenannt wurde oder nicht, ich möchte nur den Verlauf des Codes sehen, unabhängig von der Umbenennung. Meiner Meinung nach ist es daher sinnvoll--follow
, die Standardeinstellung zu verwenden, da mir einzelne Dateien egal sind.--follow
hilft mir, einzelne Umbenennungen von Dateien zu ignorieren, die normalerweise ziemlich belanglos sind.Ich habe genau das gleiche Problem, mit dem Sie konfrontiert sind. Obwohl ich Ihnen keine Antwort geben kann, glaube ich, dass Sie diese E-Mail lesen können, die Linus 2005 geschrieben hat. Sie ist sehr relevant und gibt Ihnen möglicherweise einen Hinweis, wie Sie mit dem Problem umgehen können:
Ich fand es in diesem Blog-Beitrag referenziert , was auch für Sie nützlich sein könnte, um eine praktikable Lösung zu finden:
Bitte halten Sie uns über Ihre Fortschritte auf dem Laufenden.
quelle
--color-moved
Tatsache, Git v2.15 fügt einen Schritt in Richtung dieses "idealen Tracking-Systems" hinzu. Ich habe damit gespielt, um zu sehen, wie es verschobene Linien in einer Datei verfolgt, aber versehentlich festgestellt, dass es verschobene Linien im gesamten Diff verfolgt.--follow
kann falsch sein (z. B. wenn 2 Dateien den gleichen Inhalt haben oder wenn es eine Änderung gibt zusätzlich zum Dateiwechsel).Sie werden froh sein zu wissen, dass einige beliebte Git-UI-Tools dies jetzt unterstützen. Es gibt Dutzende von Git-UI-Tools, daher werde ich nicht alle auflisten, aber zum Beispiel:
Weitere Informationen zu Git UI-Tools:
quelle
Hinweis: Git 2.9 (Juni 2016) wird die "Buggy" -Natur von
git log --follow
:Siehe Commit ca4e3ca (30. März 2016) von SZEDER Gábor (
szeder
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 26effb8 , 13. April 2016)diffcore: Korrigiert die Iterationsreihenfolge identischer Dateien während der Umbenennungserkennung
(Beachten Sie die Umkehrung hier :
B/file -> A/file
, undA/file -> B/file
)quelle
Unter Linux habe ich überprüft, ob SmartGit und GitEye Umbenennungen folgen können, wenn sie dem Verlauf einer bestimmten Datei folgen. Im Gegensatz zu gitk und GitEye zeigt SmartGit jedoch eine separate Datei- und Repository-Ansicht an (die die Verzeichnisstruktur, jedoch nicht die Liste der darin enthaltenen Dateien enthält).
quelle