Git wyszukuje ciąg w historii pojedynczego pliku

172

Więc jeśli mam plik o nazwie foo.rb i powoduje on błąd związany z brakującą metodą o nazwie bar , chcę przeszukać historię foo.rb w poszukiwaniu ciągu, baraby sprawdzić, czy został on kiedykolwiek zdefiniowany w przeszłości.

Znalazłem to Przeszukaj całą historię Git w poszukiwaniu ciągu?

Ale to przeszukuje wszystkie pliki. Chcę tylko wyszukiwać w jednym pliku.

JD Isaacks
źródło
6
Podobnie jak FYI, możesz dołączyć -- filenamedo kilku poleceń git, jeśli chcesz ograniczyć je do jednego pliku.
Karl Bielefeldt

Odpowiedzi:

234

W tym celu możesz użyć opcji -S do git log:

git log -S'bar' -- foo.rb
ralphtheninja
źródło
39
Lub git log -G'bar' -- foo.rbposzukać diff, który zawiera „bar”, zamiast zatwierdzeń zmieniających liczbę wystąpień „bar” (zobacz stronę podręcznika git-log).
Jakub Narębski
1
Nie działało to dla mnie z cudzysłowami, musiałem go użyć -Sbar, aby wyszukać pasek . Może ma to coś wspólnego ze mną za pomocą wiersza poleceń systemu Windows.
zbr
innymi słowy, -Gsłuży do wyszukiwania wyrażeń regularnych ... to też jest świetne odniesienie: stackoverflow.com/a/4472267/2586761
ptim
17

A może możesz spróbować tego (z pokrewnych pytań Przeszukaj całą historię git dla ciągu )

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

W rzeczywistości będzie szukał zawartości pliku i nie będzie zatwierdzał komunikatów / poprawek w przypadku wystąpienia baru.

Antoine Pelisse
źródło
Windows: for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb(uważaj na podwójne cudzysłowy, jeśli nazwa pliku lub wyszukiwana fraza zawiera spacje)
biscuit314
1
U mnie w systemie Windows nie działało bez „do”: for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb (uważaj na podwójne cudzysłowy, jeśli nazwa pliku lub wyszukiwana fraza zawiera spacje)
xberger
2

Istnieje przesłonięcie dla polecenia git log (z instrukcji ):

$ git log Makefile      # commits that modify Makefile

Możesz więc użyć:

git log foo.rb | grep "bar"
Dmitry Reznik
źródło
2
Dzięki, ale przeszukuje to tylko historię zmian, a nie historię źródła pliku.
JD Isaacks
2
W rzeczywistości istnieje jeszcze jedno zastąpienie, które wyszukuje zmianę danych w ciągu: git log -S'foo () '# commits, które dodają lub usuwają wszelkie dane pliku pasujące do ciągu' foo () '
Dmitry Reznik
1
Możesz także spróbować użyć parametru --full-diff. Dzienniki pokazują nie tylko historię zatwierdzeń, ale także różnice.
Dmitry Reznik
@DmitriyReznik - najwyraźniej --full-diffnie działa (jak w, nie widać różnicy) bez -p, przynajmniej na git 1.7.9.5
sdaau
0

Użyłem, git log -S "string" --follow -p "path of file"który pokazuje pełną historię wszystkich zmian z tym ciągiem.

zestaw pytań
źródło