Как выполнить Git коммитов diff или содержимого для определенного слова? - PullRequest
557 голосов
/ 27 августа 2009

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

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

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

git grep "word"

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

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

Ответы [ 8 ]

810 голосов
/ 27 августа 2009

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

$ 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" будет показывать этот коммит, git log -S"regexec\(regexp" --pickaxe-regex не будет (потому что число вхождений этой строки не изменилось).

250 голосов
/ 27 августа 2009
Кирка

git log найдет коммиты с изменениями, включая «слово» с git log -Sword

18 голосов
/ 04 сентября 2016

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

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

Требуется время, чтобы бежать, хотя ...; -)

9 голосов
/ 12 февраля 2016

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

7 голосов
/ 26 сентября 2016

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

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

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

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

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

2 голосов
/ 09 июля 2015

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

Используйте :Ggrep, чтобы сделать это. Для получения дополнительной информации вы можете установить vim-fugitive и посмотреть турориал по :help Grep. И этот эпизод: исследование истории репозитория поможет вам сделать все это.

2 голосов
/ 01 апреля 2015

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

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

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

0 голосов
/ 27 мая 2018

Если вы хотите выполнить поиск конфиденциальных данных, чтобы удалить их из своей истории мерзавцев (именно поэтому я и попал сюда), для этого есть инструменты. Github as выделенная справочная страница для этой проблемы .

Вот суть статьи:

BFG Repo-Cleaner - более быстрая и простая альтернатива git filter-branch для удаления нежелательных данных. Например, чтобы удалить файл с конфиденциальными данными и оставить ваш последний коммит без изменений), выполните:

bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA

Чтобы заменить весь текст, указанный в файле passwords.txt, где бы он ни находился в истории вашего репозитория, выполните:

bfg --replace-text passwords.txt

См. Документацию BFG Repo-Cleaner *1021* для полного использования и инструкции по загрузке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...