Git cerca la stringa nella cronologia di un singolo file


173

Quindi, se ho un file chiamato foo.rb e mi dà un errore per un metodo mancante chiamato bar , quindi voglio cercare la cronologia di foo.rb per la stringa barper vedere se è mai stata definita in passato.

Ho trovato questa ricerca in tutta la cronologia di Git per una stringa?

Ma questo cerca tutti i file. Voglio solo cercare in un file.


6
Proprio come una FYI, puoi aggiungere -- filenamea un gruppo di comandi git se vuoi limitarlo a un file.
Karl Bielefeldt,

Risposte:


235

A tale scopo è possibile utilizzare l'opzione -S per accedere a log:

git log -S'bar' -- foo.rb

39
Oppure git log -G'bar' -- foo.rbper cercare diff che contiene 'bar' piuttosto che per commit che ha cambiato il numero di occorrenze di 'bar' (vedi la manpage git-log).
Jakub Narębski,

1
Non ha funzionato per me con le virgolette, ho dovuto usarlo -Sbarper cercare la barra . Forse ha qualcosa a che fare con me usando la riga di comando di Windows.
zbr,

in altre parole, -Gè per una ricerca regex ... questo è un grande riferimento, anche: stackoverflow.com/a/4472267/2586761
PTIM

17

O forse puoi provare questo (dalle domande correlate Cerca tutta la cronologia di git per stringa )

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

Cercherà effettivamente il contenuto del file e non eseguirà il commit di messaggi / patch per qualsiasi occorrenza della barra.


Per windows: for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb(
fai

1
Per me in Windows non ha funzionato senza "do": for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb ( fai attenzione alle doppie virgolette se il nome file o la frase di ricerca hanno spazi)
xberger

2

C'è una sostituzione per il comando git log (dal manuale ):

$ git log Makefile      # commits that modify Makefile

Quindi potresti usare:

git log foo.rb | grep "bar"

2
Grazie, ma questo cerca solo la cronologia di commit, non la cronologia della fonte del file.
JD Isaacks,

2
In realtà c'è un altro override che cerca la modifica dei dati delle stringhe: git log -S'foo () '# esegue il commit che aggiunge o rimuove tutti i dati di file corrispondenti alla stringa' foo () '
Dmitry Reznik

1
Puoi anche provare a usare il parametro --full-diff. I registri non mostrano solo la cronologia delle commit, ma anche le differenze.
Dmitry Reznik,

@DmitriyReznik - apparentemente --full-diffnon funziona (come in, non viene mostrato il diff) senza -p, almeno su git 1.7.9.5
sdaau,

0

Ho usato git log -S "string" --follow -p "path of file"che mostra la cronologia completa di tutte le modifiche con quella stringa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.