Git пошук рядка в історії одного файлу


172

Отже, якщо у мене є файл під назвою foo.rb, і він дає мені помилку для відсутнього методу під назвою bar , тому я хочу шукати історію foo.rb для рядка, barщоб побачити, чи був він коли-небудь визначений у минулому.

Я знайшов цей пошук у всій історії Git для рядка?

Але це шукає всі файли. Я просто хочу шукати в одному файлі.


6
Як FYI, ви можете додати -- filenameдо команди команд git, якщо ви хочете обмежити його одним файлом.
Карл Білефельдт

Відповіді:


234

Для цього ви можете використовувати опцію -S для git log:

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

39
Або git log -G'bar' -- foo.rbшукати diff, що містить 'bar', а не для комітетів, які змінили кількість випадків 'bar' (див. Сторінку git-log).
Якуб Нарубський

1
Мені це не спрацювало з цитатами, мені довелося використовувати -Sbarйого для пошуку бару . Можливо, це має щось спільне зі мною за допомогою командного рядка Windows.
збр

Іншими словами, -Gдля пошуку регулярних виразів ... це велика посилання, теж: stackoverflow.com/a/4472267/2586761
ptim

17

А може, ви можете спробувати це (із пов’язаних питань Пошук у всій історії git для рядка )

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

Він насправді шукатиме вміст файлу, а не виконує повідомлення / виправлення при будь-якому виникненні бару.


Для вікон: for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb(годинник для подвійних лапках , якщо ім'я файлу або пошуку фраза містить прогалини)
biscuit314

1
Для мене в Windows не обійшлося без "do": for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb (дивіться на подвійні лапки, якщо у
файлі

2

Існує переопрацювання команди git log (з посібника ):

$ git log Makefile      # commits that modify Makefile

Отже, ви можете використовувати:

git log foo.rb | grep "bar"

2
Дякую, але це просто шукає історію фіксації, а не історію джерела файлу.
JD Isaacks

2
Насправді є ще одне переопрацювання, яке шукає зміну рядкових даних: git log -S'foo () '# зобов’язує додавати або видаляти будь-які файлові дані, що відповідають рядку' foo () '
Дмитро Резник

1
Ви також можете спробувати скористатися параметром --full-diff. У журналах не тільки відображається історія комісій, але й відмінності також.
Дмитро Резник

@DmitriyReznik - мабуть --full-diff, не працює (як у, не показано відмінності) без -p, принаймні, на git 1.7.9.5
sdaau

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.