Git-Suche nach Zeichenfolge im Verlauf einer einzelnen Datei

172

Wenn ich also eine Datei mit dem Namen foo.rb habe und eine Fehlermeldung für eine fehlende Methode namens bar angezeigt wird, möchte ich den Verlauf von foo.rb nach der Zeichenfolge durchsuchen, um festzustellenbar , ob sie jemals in der Vergangenheit definiert wurde.

Ich habe diese Suche im gesamten Git-Verlauf nach einer Zeichenfolge gefunden.

Dies durchsucht jedoch alle Dateien. Ich möchte nur in einer Datei suchen.

JD Isaacks
quelle
6
Genau wie zu Ihrer Information können Sie -- filenameeine Reihe von Git-Befehlen anhängen , wenn Sie sie auf eine Datei beschränken möchten.
Karl Bielefeldt

Antworten:

234

Zu diesem Zweck können Sie die Option -S verwenden, um das Protokoll zu erstellen:

git log -S'bar' -- foo.rb
ralphtheninja
quelle
39
Oder git log -G'bar' -- foo.rbum nach Diff zu suchen, das 'bar' enthält, anstatt nach Commits, die die Anzahl der Vorkommen von 'bar' geändert haben (siehe git-log-Manpage).
Jakub Narębski
1
Bei den Zitaten hat es bei mir nicht funktioniert, ich musste -Sbares verwenden, um nach Balken zu suchen . Vielleicht hat es etwas damit zu tun, dass ich die Windows-Befehlszeile benutze.
zbr
Mit anderen Worten, -Gist für eine Regex-Suche ... dies ist auch eine großartige Referenz: stackoverflow.com/a/4472267/2586761
ptim
17

Oder vielleicht können Sie es versuchen (aus verwandten Fragen Durchsuchen Sie den gesamten Git-Verlauf nach Zeichenfolgen )

git rev-list --all foo.rb | (
    while read revision; do
        git grep -F 'bar' $revision foo.rb
    done
)

Es wird tatsächlich nach Dateiinhalten gesucht und keine Nachrichten / Patches für das Auftreten von Balken festgeschrieben.

Antoine Pelisse
quelle
Für Windows: for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb(
Achten Sie
1
Für mich in Windows hat es ohne "do" nicht funktioniert: for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb (
Achten Sie
2

Es gibt eine Überschreibung für den Befehl git log (aus dem Handbuch ):

$ git log Makefile      # commits that modify Makefile

Sie könnten also verwenden:

git log foo.rb | grep "bar"
Dmitry Reznik
quelle
2
Vielen Dank, aber dies durchsucht nur den Festschreibungsverlauf, nicht den Verlauf der Quellquelle der Datei.
JD Isaacks
2
Es gibt tatsächlich eine weitere Überschreibung, die nach Änderungen der Zeichenfolgendaten sucht: git log -S'foo () '# Commits, die Dateidaten hinzufügen oder entfernen, die mit der Zeichenfolge' foo () 'übereinstimmen
Dmitry Reznik
1
Sie können auch versuchen, den Parameter --full-diff zu verwenden. Protokolle zeigen nicht nur den Commit-Verlauf, sondern auch die Unterschiede.
Dmitry Reznik
@DmitriyReznik - --full-difffunktioniert anscheinend nicht (wie in, kein Diff wird gezeigt) ohne -p, zumindest auf Git 1.7.9.5
Sdaau
0

Ich habe verwendet, git log -S "string" --follow -p "path of file"was den vollständigen Verlauf aller Änderungen mit dieser Zeichenfolge zeigt.

Fragen stapeln
quelle