2009-08-26 7 views
457

W repozytorium kodu Git chcę wyświetlić listę wszystkich zatwierdzeń, które zawierają określone słowo. Próbowałem toJak grep Git commit diffs lub content dla określonego słowa?

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

ale niekoniecznie daje mi nazwę pliku (chyba że jest to mniej niż 5 linii z dala od słowa Szukałam. Próbowałem też

git grep "word" 

ale daje mi tylko obecne pliki, a nie historia:

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

Odpowiedz

659

Jeśli chcesz znaleźć wszystkie zobowiązuje gdzie popełniają wiadomość zawiera dane słowo, użyj

$ git log --grep=word 

Jeśli chcesz aby znaleźć wszystkie zatwierdzenia, w których "słowo" zostało dodane lub usunięte w treści pliku : (dokładniej: gdzie liczba wystąpień słowa "zmienił się), tj. przeszukuj treść commit, użyj tzw. szukaj „kilof” z

$ git log -Sword 

We współczesnej git istnieje również

$ git log -Gword 

szukać różnic których dodawane lub usuwane linia pasuje „słowo” (również popełnić zawartość).

Należy pamiętać, że -G domyślnie przyjmuje wyrażenie regularne, a -S przyjmuje ciąg znaków, ale można go zmodyfikować tak, aby akceptował wyrażenia regularne za pomocą --pickaxe-regex.

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

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

Podczas git log -G"regexec\(regexp" pokaże tego dokonać, git log -S"regexec\(regexp" --pickaxe-regex nie będzie (bo liczba wystąpień tego ciągu nie uległy zmianie).

+5

'git log -S word' działa również dla drugiego przypadku –

+0

* -S * w * man git log' jest tak niejasne. Trzy razy musiałem czytać i eksperymentować, żeby zauważyć różnicę. –

+3

@TankorSmash '-S ' Poszukaj różnic, które wprowadzają lub usuwają wystąpienie . '-G ' Poszukaj różnic, których dodana lub usunięta linia pasuje do podanej . –

239

git log „s kilof znajdzie zobowiązuje się zmiany w tym«słowo»z git log -Sword

+55

To nie jest do końca precyzyjne. -S Poszukaj różnic wprowadzających lub usuwających instancję . ** Zauważ, że jest to coś innego niż ciąg znaków pojawiający się po prostu na wyjściu diff; ** – mayu

+4

Podczas gdy jest to ogólnie poprawna odpowiedź, obniżam tylko, aby zachęcić innych do przeczytania tej odpowiedzi (http://stackoverflow.com/a/1340245/ 586983), który ma 3 różne sposoby i wyjaśnia ich subtelności. – jakeonrails

+9

gosh! Nie sądzę, że jest to dobry powód, by zgodzić się z właściwą odpowiedzią ... nie byli Państwo pewni, że link w komentarzu byłby wystarczającą zachętą? – Deborah

3

Aby użyć złącza na logiczną wyrażenia regularnego:

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

Ten regularny wyszukiwania wyrażenie wyrażenie regularne [0-9] * lub [A-Z] * na popełnić wiadomości.

6

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

9

Po wielu eksperymentach, mogę polecić następujące dane, które pokazuje, rewizje, które wprowadzają lub usunąć wiersze zawierające danego wyrażenia regularnego i wyświetla zmiany tekstu w każdym z kolorami pokazującymi dodane i usunięte słowa.

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

zajmuje trochę czasu, aby uruchomić chociaż ... ;-)

6

Można spróbować następującego polecenia:

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

lub korzystają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 szukać.

+2

Podoba mi się ta metoda, ponieważ zatwierdzenia, na które patrzę, mają setki linii niezwiązanych ze sobą zmian i interesują mnie tylko łaty zawierające słowo, którego szukam. Aby uzyskać kolor, użyj 'git log --patch --color = always | less +/searching_string'. –