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?
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 wersjigit branch
. Błąd był związany z notacjąHEAD
aliasing.Rozwiązałem to dodając
sed '/->/d'
w rurze, pomiędzytr
ixargs
.
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>
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
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/)'
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:
-
git grep-branch
- Wyszukiwanie we wszystkich oddziałach lokalnych i zdalnych -
git grep-branch-local
- Szukaj tylko w lokalnych oddziałach -
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 (odbranch -a
) i * (active branch name have it); -
grep -v -e '\\->'
- Ignoruj złożone nazwy jakremotes/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
- Oddział:
dev
- numer linii:
53
- ścieżka do pliku:
modules/factory/getters.php
- 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"
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
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ść
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