Warum zeigt das Git-Protokoll möglicherweise keinen Verlauf für eine verschobene Datei an und was kann ich dagegen tun?

88

Ich habe ein paar Dateien umbenannt git mv, verwendet git stash, einen kurzen Blick auf HEAD geworfen (ohne es zu ändern) und dann git stash popdas ganze Los wieder zurückbekommen. Meine Züge waren von der Festschreibungsliste verschwunden, daher habe ich sie mit überarbeitet git rmund die Festschreibungsnachricht behauptete, Git habe festgestellt, dass die Umbenennung eine Umbenennung war. Also dachte ich nicht mehr daran.

Aber jetzt, nach dem Festschreiben, kann ich nicht mehr auf den Verlauf der verschobenen Dateien zugreifen! Folgendes sagt git zu dem fraglichen Commit:

~/projects% git log --summary
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.h
 delete mode 100644 test/R_DebugUI_iOS.m
 create mode 100644 system/runtime/src/R_DebugUI_iOS.h
 create mode 100644 system/runtime/src/R_DebugUI_iOS.m

 <<snip older commits>>
 ~/projects%

Ich versuche jetzt, den Verlauf einer dieser verschobenen Dateien abzurufen, damit ich mir eine alte Version ansehen kann, aber ich bekomme nichts sehr Nützliches:

~/projects/system/runtime/src% git log --follow --find-copies-harder -M -C R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime
~/projects/system/runtime/src% 

(Ich habe versucht , es auch ohne -M, -Cund --find-copies-harder, aber ohne Erfolg.)

Ich kann seine Geschichte unter seinem alten Namen abrufen, der an dem Punkt endet, an dem er von seinem alten Standort gelöscht wurde:

~/projects% git log --summary --follow --find-copies-harder -M -C -- test/R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.m

commit 32a22d53c27e260714f759ecb3d3864e38b2e87f
Author: brone
Date:   Tue Dec 7 23:52:51 2010 +0000

    Can set debug UI's alpha.

<<snip older commits>>
~/projects%

Diesmal stecke ich also nicht ganz fest, aber ich würde nicht gerne die ganze Zeit so etwas tun müssen. (Ich gehe davon aus, dass eine ganze Reihe von Dateien mindestens einmal in ihrem Leben verschoben werden.)

Mache ich etwas falsch? Die alte und die neue Kopie der Datei sind zu 98,8% gleich (2 von 166 Zeilen wurden geändert). Mein Verständnis ist, dass git in diesem Fall in der Lage sein sollte, die Datei zu verfolgen, da es Umbenennungsvorgänge ableitet, anstatt sie explizit zu speichern, und die Dateien so ähnlich sind, dass ich glaube, dass sie gleich betrachtet werden sollten.

Kann ich irgendetwas tun, um das zu beheben?


quelle
Ratet mal: Funktioniert es, wenn Sie den Befehl in ~ / projects / anstelle von ~ / projects / system / runtime / src ausführen?
Douglas
Nein, ich bekomme das gleiche Ergebnis. (Im Allgemeinen scheint Git ziemlich gut darin zu sein, Sie in einem beliebigen Ordner zu lassen ...)
Das brachte mich jedoch auf eine Idee und ich aktualisierte die Frage mit meinen Ergebnissen. Danke für den Kommentar!
Ich benutze "tortoiseGit 1.5.8.0" zusammen mit "1.7.3.1.msysgit.0" auf mswindows. Wenn ich eine Datei im Explorer umbenenne + festschreibe, sehe ich in meiner GUI "status = Rename". Ich weiß nicht genug über Git, wie man das in der Kommandozeile macht, um zu antworten, wie man das macht, aber tortoiseGit hat etwas für mich getan, das so funktioniert hat, wie Sie es erwartet haben.
k3b
3
Ist das ein Betrüger? stackoverflow.com/questions/2314652/…
Cregox

Antworten:

28

Nun, ich sehe meine Umbenennungen mit git log -M --summary..

user502515
quelle
git log -M --summarygibt keine Umbenennungsinformationen an, wenn Sie nur den Verlauf einer bestimmten Datei betrachten, dh mit einem Dateiargument.
vinc17
17

Beantwortung meiner eigenen Frage, da ich es geschafft habe, meine Bedenken auszuräumen, auch wenn ich mein Problem nicht genau gelöst habe. ( git log --followfunktioniert bei mir aber immer noch nicht.)

Erstens enthält das --summaryProtokoll für das Umbenennungs-Commit die deleteZeile mit dem alten Namen der Datei. Wenn es also leicht zu erkennen ist, können Sie den alten Namen und git logvon dort aus finden.

Wenn es Teil eines großen Commits ist und daher etwas schwerer zu erkennen ist - und diese Situation war eine meiner Sorgen -, git blame -Ckann es mit dem neuen Namen der Datei bei der ersten Überarbeitung nach dem Umbenennen verwendet werden. Vermutlich bleiben Zeilen aus der Originaldatei! - Git sollte also ihre Quelle finden und den alten Dateinamen anzeigen (und einen Commit-Hash für ein gutes Maß). Sie können dann den Weg mit aufnehmen git log.

Wenn Sie also Interesse an der Historie der Datei als Einheit haben (aus welchem ​​Grund auch immer), scheint dies relativ einfach zu sein. Obwohl ich den Eindruck habe, dass Git es vorziehen würde, wenn Sie es richtig verwenden.


quelle
6
Ich denke, Sie benötigen die Option -M, um tatsächlich Umbenennungen anzuzeigen, anstatt sie zu löschen / hinzuzufügen
Adrian Cornish
1
Hatte gerade das gleiche Problem und bemerkte, dass Ihr Arbeitsverzeichnis einen Unterschied macht, git log --follow .wo das Arbeitsverzeichnis der neue Speicherort ist, nicht funktioniert, während git log --follow path/to/new/dir, ausgeführt von einem gemeinsamen übergeordneten Verzeichnis des alten und des neuen Speicherorts, funktioniert
akraf
1
Der --followParameter funktioniert, aber Sie müssen tun:git log --follow -- ./path/to/file
DrumM
Ich habe gerade das Problem, das beim git -log filename.csFestschreiben der Dateibewegung stoppt (das aktuelle Verzeichnis wird auf den Ordner der Datei festgelegt). Das VS-Verlaufsfenster zeigt jedoch das gesamte Dateiänderungsprotokoll an. Ich kann auch sehen, dass die Datei mit dem Github-Desktop verschoben wurde. Aber git log -10 --follow filename.cszeigt das Protokoll vor dem Umzug begehen zu.
Oleksa
10
git log --follow ./path/to/file

Ich glaube, das ist es, wonach du suchst.

janetkuo
quelle
3
Die Antwort von vor fünf Jahren enthält diese Informationen.
Dotancohen