Для поиска коммита содержимого (т. Е. Фактических строк исходного текста, в отличие от сообщений коммита и т. П.), Вам нужно сделать:
git grep <regexp> $(git rev-list --all)
git rev-list --all | xargs git grep <expression>
будет работать, если вы столкнетесь с ошибкой «Список аргументов слишком длинный».
Если вы хотите ограничить поиск каким-либо поддеревом (например, "lib / util"), вам нужно будет передать его подкоманде rev-list
и grep
:
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util
Это пролистает весь текст вашего коммита для regexp
.
Причина прохождения пути в обеих командах заключается в том, что rev-list
вернет список ревизий, где произошли все изменения в lib/util
, но вам также нужно перейти к grep
, чтобы он выполнял поиск только в lib/util
.
Представьте себе следующий сценарий: grep
может найти то же <regexp>
в других файлах, содержащихся в той же ревизии, возвращенной rev-list
(даже если в этой ревизии не было изменений в этом файле).
Вот несколько других полезных способов поиска вашего источника:
Поиск в рабочем дереве текста, соответствующего регулярному выражению regexp:
git grep <regexp>
Поиск в рабочем дереве строк текста, соответствующих регулярному выражению regexp1 или regexp2:
git grep -e <regexp1> [--or] -e <regexp2>
Поиск в рабочем дереве строк текста, соответствующих регулярным выражениям regexp1 и regexp2, только пути к файлам отчетов:
git grep -e <regexp1> --and -e <regexp2>
Поиск в рабочем дереве файлов, в которых строки текста соответствуют регулярному выражению regexp1, а строки текста соответствуют регулярному выражению regexp2:
git grep -l --all-match -e <regexp1> -e <regexp2>
Поиск в рабочем дереве для измененных строк шаблона соответствия текста:
git diff --unified=0 | grep <pattern>
Поиск во всех ревизиях текста, соответствующего регулярному выражению регулярное выражение:
git grep <regexp> $(git rev-list --all)
Поиск во всех ревизиях между rev1 и rev2 текста, соответствующего регулярному выражению regexp:
git grep <regexp> $(git rev-list <rev1>..<rev2>)