Czy możliwe jest wykonanie 'grep search' we wszystkich gałęziach projektu Git?

Czy możliwe jest uruchomienie git grep wewnątrz wszystkich gałęzi projektu Git control? A może jest jakieś inne polecenie do uruchomienia?

 146
Author: Peter Mortensen, 2013-03-08

6 answers

Pytanie " Jak grep (search) committed code w historii Gita?" poleca:

 git grep <regexp> $(git rev-list --all)

Przeszukuje wszystkie commity, które powinny zawierać wszystkie gałęzie.

Inna forma to:

git rev-list --all | (
    while read revision; do
        git grep -F 'yourWord' $revision
    done
)
Więcej przykładów znajdziesz w w tym artykule :

Wypróbowałem powyższy projekt na tyle duży, że git narzekał na rozmiar argumentu, więc jeśli napotkasz ten problem, zrób coś like:

git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)

(zobacz alternatywę w ostatniej części tej Odpowiedzi, poniżej)

Nie zapomnij o tych ustawieniach, jeśli chcesz je:

# Allow Extended Regular Expressions
git config --global grep.extendRegexp true
# Always Include Line Numbers
git config --global grep.lineNumber true

Ten alias też może pomóc:

git config --global alias.g "grep --break --heading --line-number"

Uwaga: czernjie sugerowane , że git rev-list --all jest przesadą.

Bardziej dopracowanym poleceniem może być:

git branch -a | tr -d \* | xargs git grep <regexp>

Który pozwoli Ci wyszukiwać tylko gałęzie (w tym odległe gałęzie)

Możesz nawet utwórz dla niego Alias bash/zsh:

alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>

Aktualizacja sierpień 2016: R. M. zaleca w komentarzach

Dostałem "fatal: bad flag '->' used after filename" podczas próby wersji git branch. Błąd był związany z notacją HEAD aliasing.

Rozwiązałem to dodając sed '/->/d' w rurze, pomiędzy tr i xargs.

 git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>

Czyli:

alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>
 198
Author: VonC,
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-12-05 13:05:04

git log może być bardziej efektywnym sposobem wyszukiwania tekstu we wszystkich gałęziach, zwłaszcza jeśli jest wiele dopasowań i chcesz najpierw zobaczyć nowsze (istotne) zmiany.

git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'

Te polecenia dziennika wypisują commity, które dodają lub usuwają dany ciąg wyszukiwania/regex, (ogólnie) nowszy jako pierwszy. Opcja -p powoduje wyświetlenie odpowiedniego rozróżnienia, gdzie wzór został dodany lub usunięty, dzięki czemu można go zobaczyć w kontekście.

Po znalezieniu odpowiedniego commita, który dodaje tekst szukałeś (np. 8beeff00d), znajdź gałęzie zawierające commit:

git branch -a --contains 8beeff00d
 68
Author: Edward Anderson,
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-10-07 00:24:27

Znalazłem to najbardziej przydatne:

git grep -i foo `git for-each-ref --format='%(refname)' refs/`

Musisz dostosować Ostatnie argumenty w zależności od tego, czy chcesz patrzeć tylko na gałęzie zdalne vs. lokalne, tzn.:

  • git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
  • git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)

Alias który stworzyłem wygląda tak:

grep-refs = !sh -c 'git grep "$0" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'
 24
Author: errordeveloper,
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
2019-10-29 09:52:57

Można to zrobić na dwa popularne sposoby: aliasy Bash lub Git]}

Oto trzy komendy:

  1. git grep-branch - Wyszukiwanie we wszystkich oddziałach lokalnych i zdalnych
  2. git grep-branch-local - Szukaj tylko w lokalnych oddziałach
  3. git grep-branch-remote - Tylko zdalne gałęzie

Użycie jest takie samo jak git grep

git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"

GREP using: Git aliases

Plik~/.gitconfig

Polecenia powinny być dodawane ręcznie do pliku ~/.gitconfig, ponieważ git config --global alias skomplikowany kod, który dodajesz i psujesz.


[alias]
    grep-branch        = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | xargs git grep $@; };f "
    grep-branch-remote = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | grep '^remotes' | xargs git grep $@; };f"
    grep-branch-local  = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' -e '^remotes' | xargs git grep $@;  };f "

Uwaga: gdy dodajesz aliasy i nie uruchamiasz ich-sprawdź ukośniki \ mogą one wymagać dodatkowej ucieczki \\ w porównaniu do komend bash.

  • git branch -a - wyświetl wszystkie gałęzie;
  • sed -e 's/[ \\*]*//' - Trim spacje (od branch -a) i * (active branch name have it);
  • grep -v -e '\\->' - Ignoruj złożone nazwy jak remotes/origin/HEAD -> origin/master;
  • grep '^remotes' - Get all remote branches;
  • grep -v -e '^remotes' - Get gałęzie z wyjątkiem odległych gałęzi;

Przykład git grep-branch-local -n getTastyCookies

-n przedrostek numeru linii do pasujących linii.

[user@pc project]$ git grep-branch-local -n getTastyCookies

dev:53:modules/factory/getters.php:function getTastyCookies($user);
master:50:modules/factory/getters.php:function getTastyCookies($user)

Obecna struktura to:

: - Separator

  1. Oddział: dev
  2. numer linii: 53
  3. ścieżka do pliku: modules/factory/getters.php
  4. pasująca linia: function getTastyCookies($user)

GREP using: BASH

Jak powinieneś wiedzieć: polecenia Bash powinny być przechowywane w skryptach .sh lub uruchamiane w shell.

Tylko lokalne oddziały

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' -e '^remotes' | xargs git grep "TEXT"

Tylko zdalne gałęzie

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep "TEXT"

Lokalne i zdalne oddziały

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | xargs git grep "TEXT"
 6
Author: Devaldo,
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
2019-06-24 16:22:17

Oto Jak to robię:

git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM
 4
Author: William Entriken,
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-09-24 15:51:16

Jeśli nadasz jakiemuś commitowi wartość skrótu SHA-1 git grep, masz w nich wyszukiwarkę, a nie kopię roboczą.

Aby przeszukać wszystkie gałęzie, możesz uzyskać Wszystkie drzewa z git rev-list --all. Put it all with

git grep "regexp" $(git rev-list --all)

... i miej cierpliwość

 4
Author: CharlesB,
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
2019-10-29 09:51:54