Как 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, ®match, 0);
...
- hit = !regexec(regexp, mf2.ptr, 1, ®match, 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 поможет вам сделать все это.