Как grep Git фиксировать diff или содержимое для определенного слова?

В репозитории кода Git я хочу перечислить все коммиты, содержащие определенное слово. Я попробовал это

git log -p | grep --context=4 "word"

но это не обязательно возвращает мне имя файла (если только оно меньше 5 вдали от слова, которое я искал. Я также пробовал

git grep "word"

но он дает мне только текущие файлы, а не историю.

Как мне искать всю историю, чтобы я мог следить за изменениями на конкретном слове? Я хочу найти свою кодовую базу для появления слов для отслеживания изменений (поиск в истории файлов).

Ответ 1

Если вы хотите найти все коммиты, где сообщение commit содержит заданное слово, используйте

$ git log --grep=word

Если вы хотите найти все коммиты, где "слово" было добавлено или удалено в содержимом файла (точнее: когда число вхождений "слова" изменилось), т.е. поиск содержимого фиксации, используйте так называемую "кирку" 'поиск с помощью

$ git log -Sword

В современном git есть также

$ git log -Gword

чтобы найти различия, чья добавленная или удаленная строка соответствует "слову" (также фиксирует содержимое).

Обратите внимание, что -G по умолчанию принимает регулярное выражение, а -S принимает строку, но может быть изменено для приема регулярных выражений с помощью --pickaxe-regex.

Чтобы проиллюстрировать разницу между -S<regex> --pickaxe-regex и -G<regex>, рассмотрите фиксацию со следующим diff в том же файле:

+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

Пока git log -G"regexec\(regexp" покажет это commit, git log -S"regexec\(regexp" --pickaxe-regex не будет (потому что количество вхождений этой строки не изменилось).

Ответ 2

git log pickaxe найдет фиксации с изменениями, включая "слово" с git log -Sword

Ответ 3

Еще один способ/синтаксис: git log -S "word"
Например, вы можете найти пример git log -S "with whitespaces and stuff @/#ü !"

Ответ 4

После большого количества экспериментов я могу порекомендовать следующее, которое показывает коммиты, которые вводят или удаляют строки, содержащие заданное регулярное выражение, и отображают изменения текста в каждом, с цветами, показывающими слова, добавленные и удаленные.

git log --pickaxe-regex -p --color-words -S "<regexp to search for>"

Занимает некоторое время, хотя...; -)

Ответ 5

Вы можете попробовать следующую команду:

git log --patch --color=always | less +/searching_string

или используя grep следующим образом:

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'

Запустите эту команду в родительском каталоге, где вы хотите выполнить поиск.

Ответ 6

Чтобы использовать логический коннектор для регулярного выражения:

git log --grep '[0-9]*\|[a-z]*'

Это регулярное выражение ищет регулярное выражение [0-9] * или [a-z] * для сообщений о фиксации.

Ответ 7

vim-fugitive является универсальным для такого рода исследований в Vim.

Используйте :Ggrep для этого. Для получения дополнительной информации вы можете установить vim-fugitive и посмотреть на turorial на :help Grep. И этот эпизод: exploring-the-history-of-a-git-repository поможет вам сделать все это.