Warum funktioniert "git log -‌- foo" nicht für gelöschte Dateien foo?

89

Mein Repository wurde wie folgt geändert:

  1. ... einige nicht verwandte Commits ...
  2. Festschreiben einer neuen Datei foomit 100 Inhaltszeilen
  3. ... intervenierende Commits, von denen einige berühren foo...
  4. Fügen Sie den Inhalt von foooben in eine vorhandene Datei barund git rm fooin das gleiche Commit ein
  5. ... mehr unabhängige Verpflichtungen ...

Jetzt möchte ich das Protokoll der gelöschten Datei sehen foo. Alles, was ich gelesen habe, einschließlich SO, sagt, dass ich dazu in der Lage sein sollte git log -- foo, aber dieser Befehl erzeugt keine Ausgabe.

Wenn ich das Commit finde, das das Löschen umfasst, fookann git log 1234abcd -- fooich das Protokoll sehen und denke, dass mein Weg zu foonicht das Problem ist. Beachten Sie auch, dass git merge-base HEAD 1234abcdAusgaben 1234abcd[...], so dass ich denke, dass beweisen sollte, dass das Commit von erreichbar ist HEAD. Beachten Sie, dass sich fooin meinem Arbeitsbaum keine Datei befindet (offensichtlich, da sie gelöscht wurde). Verwenden von Git 1.7.1.1 unter OS X.

Warum funktioniert das git log -- foobei mir nicht und wie kann ich es beheben? Vielen Dank!

user385804
quelle
5
Hast du es versucht git log --follow -- foooder git log --follow -M -- foo? (um die Umbenennungserkennung zu erzwingen)
VonC
1
Mist, ich habe es versucht - aber --followbeim Lesen habe historyich gesehen, dass ich seitdem woanders cd'ed hatte, als ich es versuchte, was den Pfad ungültig machte. git log --follow -- foohat funktioniert, als ich es vom richtigen Ausgangspunkt aus versucht habe. Ich denke , Git betrachtet rollt fooin barder Umbenennungs als eine Art? Auf jeden Fall danke! Ich werde dies gerne gutschreiben, wenn Sie es als Antwort erneut veröffentlichen.
user385804
1
Ärgerlich, dass im --Fragentitel geändert wird ...
Cascabel

Antworten:

118

Sie möchten die --followOption on verwenden git log, die in der Manpage wie folgt beschrieben wird:

Continue listing the history of a file beyond renames.

Auf diese Weise können Sie nicht nur den Verlauf einer umbenannten Datei anzeigen, sondern auch den Verlauf einer Datei, die nicht mehr im Arbeitsbaum angezeigt wird. Der Befehl, den Sie verwenden sollten, sollte also ungefähr so ​​aussehen:

git log --follow -- foo

Aktualisieren:

Git 2.9+ hat dies jetzt standardmäßig für alle git diffund git logBefehle aktiviert :

Die Befehle für Endbenutzer mit Porzellanebene in den Familien "git diff" und "git log" aktivieren standardmäßig die Umbenennungserkennung. Sie können weiterhin die Konfigurationsvariable "diff.renames" verwenden, um dies zu deaktivieren.

Danke an x-yuri für das Heads Up!

Nathan Kleyn
quelle
1
Es hat bei mir ohne das --followTeil funktioniert . Ich musste nur hinzufügen --. Ich renne git-2.9.0.
X-Yuri