Jak grep git commit diffs lub zawartość dla danego słowa?

W repozytorium kodu Git chcę wyświetlić listę wszystkich commitów, które zawierają określone słowo. Próbowałem tego

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

Ale nie musi mi zwracać nazwy pliku (chyba, że jest mniej niż 5 wiersze z dala od słowa, którego szukałem. Próbowałem też

git grep "word"

Ale daje mi tylko obecne pliki, a nie historię.

Jak przeszukać całą historię, aby śledzić zmiany w danym słowie? Mam na myśli przeszukanie mojej bazy kodowej pod kątem wystąpień słowa, aby wyśledzić zmiany (szukaj w historii plików).

Author: Jesper Rønn-Jensen, 2009-08-27

8 answers

Jeśli chcesz znaleźć wszystkie commity, w których commit message zawiera podane słowo, użyj

$ git log --grep=word

Jeśli chcesz znaleźć wszystkie commity, w których "słowo "zostało dodane lub usunięte w zawartość pliku (dokładniej: gdzie liczba wystąpień" słowa " się zmieniła), np. przeszukaj zawartość , użyj tzw.]}

$ git log -Sword

W nowoczesnym git istnieje również

$ git log -Gword

Aby szukać różnic których dodana lub usunięta linia pasuje do "Worda" (również Zatwierdź zawartość ).

Zauważ, że -G domyślnie akceptuje wyrażenia regularne, podczas gdy -S akceptuje ciąg znaków, ale można go zmodyfikować, aby zaakceptować wyrażenia regularne za pomocą --pickaxe-regex.

Aby zilustrować różnicę pomiędzy -S<regex> --pickaxe-regex i -G<regex>, rozważ commit z następującym różnicowaniem w tym samym pliku:

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

Podczas gdy git log -G"regexec\(regexp" pokaże ten commit, git log -S"regexec\(regexp" --pickaxe-regex nie pokaże (ponieważ liczba wystąpień tego ciągu nie uległa zmianie).

 724
Author: Jakub Narębski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-16 21:45:13

git log's kilof znajdzie commity ze zmianami, w tym "word" z git log -Sword

 241
Author: u0b34a0f6ae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-10 11:51:35

Po wielu eksperymentach, mogę polecić następujące, które pokazuje commity, które wprowadzają lub usuwają linie zawierające dane wyrażenie regularne, i wyświetla zmiany tekstu w każdym z nich, z kolorami pokazującymi słowa dodane i usunięte.

git log --pickaxe-regex -p --color-words -S "<regexp to search for>"
/ Align = "left" / .. ;-)
 11
Author: CharlesW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-04 16:12:44

Jeszcze jeden sposób / składnia to: git log -S "word"
W ten sposób możesz wyszukać na przykład git log -S "with whitespaces and stuff @/#ü !"

 7
Author: 1u-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-11 23:03:57

Możesz wypróbować następujące polecenie:

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

Lub używając grep w następujący sposób:

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

Uruchom to polecenie w katalogu nadrzędnym, w którym chcesz wyszukać.

 6
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-17 09:53:44

Aby użyć łącznika boolean w wyrażeniu regularnym:

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

To wyrażenie regularne wyszukuje wyrażenia regularne [0-9] * lub [a-Z]* w wiadomościach commit.

 3
Author: Reudismam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-30 20:18:11

Vim-fugitive jest uniwersalny do tego typu badań w Vim.

Użyj :Ggrep, aby to zrobić. Aby uzyskać więcej informacji, możesz zainstalować vim-fugitive i sprawdzić turorial przez :help Grep. A ten odcinek: odkrywanie-historii-git-repozytorium poprowadzi cię do tego wszystkiego.

 2
Author: lerner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-09 06:49:20

Jeśli chcesz wyszukać wrażliwe dane, aby usunąć je z historii Gita( co jest powodem, dla którego wylądowałem tutaj), są do tego narzędzia. Github jako dedykowana strona pomocy dla tego problemu .

Oto treść artykułu:

BFG Repo-Cleaner jest szybszą i prostszą alternatywą dla git filter-branch do usuwania niechcianych danych. Na przykład, aby usunąć plik z poufnymi danymi i pozostawić najnowszy commit nietknięty), run:

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

Aby zastąpić wszystkie teksty wymienione w hasłach.txt wszędzie tam, gdzie można go znaleźć w historii repozytorium, Uruchom:

bfg --replace-text passwords.txt
Aby uzyskać pełne instrukcje użytkowania i pobierania, zapoznaj się z dokumentacją BFG Repo-Cleaner .
 0
Author: edelans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-27 20:33:36