Czy można uruchomić git grep
wszystkie gałęzie projektu źródłowego Git? Czy jest inne polecenie do uruchomienia?
Czy można uruchomić git grep
wszystkie gałęzie projektu źródłowego Git? Czy jest inne polecenie do uruchomienia?
Odpowiedzi:
Pytanie „ Jak grepować (wyszukiwać) zatwierdzony kod w historii git? ” Zaleca:
git grep <regexp> $(git rev-list --all)
To przeszukuje wszystkie zatwierdzenia, które powinny obejmować wszystkie gałęzie.
Inną formą byłoby:
git rev-list --all | (
while read revision; do
git grep -F 'yourWord' $revision
done
)
Jeszcze więcej przykładów znajdziesz w tym artykule :
Wypróbowałem powyższe na jednym projekcie na tyle dużym, że git narzekał na rozmiar argumentu, więc jeśli napotkasz ten problem, zrób coś takiego:
git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)
(zobacz alternatywę w ostatniej sekcji tej odpowiedzi poniżej)
Nie zapomnij o tych ustawieniach, jeśli je chcesz:
# 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: chernjie zasugerował, że git rev-list --all
to przesada.
Bardziej wyrafinowanym poleceniem może być:
git branch -a | tr -d \* | xargs git grep <regexp>
Co pozwoli ci przeszukać tylko oddziały (w tym oddziały zdalne)
Możesz nawet utworzyć dla niego alias bash / zsh:
alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>
Aktualizacja sierpień 2016: RM zaleca w komentarzach
fatal: bad flag '->' used after filename
Podczas testowaniagit branch
wersji wyświetla się „ ” . Błąd był związany zHEAD
notacją aliasingu.I rozwiązać przez wprowadzenie
sed '/->/d'
do rury, pomiędzytr
i naxargs
polecenia.
git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>
To jest:
alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>
git branch
do tr lub sed; git branch
to porcelanowe polecenie przeznaczone do spożycia przez ludzi. Zobacz stackoverflow.com/a/3847586/2562319, aby uzyskać preferowane alternatywy.
git log
może być skuteczniejszym 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 zawierają listę zatwierdzeń, które dodają lub usuwają podany ciąg wyszukiwania / wyrażenie regularne, (zazwyczaj) najpierw nowszy. -p
Opcja powoduje istotne diff być pokazany w którym wzór został dodany lub usunięty, dzięki czemu można zobaczyć go w kontekście.
Po znalezieniu odpowiedniego zatwierdzenia, które dodaje tekst, którego szukasz (np. 8beeff00d), znajdź gałęzie zawierające zatwierdzenie:
git branch -a --contains 8beeff00d
Uważam, że to najbardziej przydatne:
git grep -i foo `git for-each-ref --format='%(refname)' refs/`
Musiałbyś dostosować ostatnie argumenty w zależności od tego, czy chcesz patrzeć tylko na oddziały zdalne, czy lokalne, tj .:
git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)
Utworzony przeze mnie alias wygląda następująco:
grep-refs = !sh -c 'git grep "$0" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'
git for-each-ref
pomocą --sort=-committerdate --count=100
! Dzięki za oryginalny pomysł!
Można to zrobić na dwa popularne sposoby: aliasy Bash lub Git
Oto trzy polecenia:
git grep-branch
- Szukaj we wszystkich oddziałach lokalnych i zdalnychgit grep-branch-local
- Szukaj tylko w oddziałach lokalnychgit grep-branch-remote
- Tylko oddziały zdalneUżycie jest takie samo jak git grep
git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"
Polecenia należy dodawać ręcznie do ~/.gitconfig
pliku, ponieważ git config --global alias
oceniają dodawany złożony kod i psują go.
[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: Kiedy dodajesz aliasy i nie działają one - sprawdź odwrotne ukośniki \
, mogą wymagać dodatkowego znaku ucieczki \\
w porównaniu z poleceniami bash .
git branch -a
- Wyświetl wszystkie gałęzie;sed -e 's/[ \\*]*//'
- Przytnij spacje (od branch -a
) i * (ma to nazwa aktywnej gałęzi);grep -v -e '\\->'
- Ignoruj złożone nazwy, takie jak remotes/origin/HEAD -> origin/master
;grep '^remotes'
- Zdobądź wszystkie zdalne oddziały;grep -v -e '^remotes'
- Zdobądź oddziały z wyjątkiem oddziałów zdalnych;git grep-branch-local -n getTastyCookies
-n
Prefiks numer 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
dev
53
modules/factory/getters.php
function getTastyCookies($user)
Jak powinieneś wiedzieć: Polecenia Bash powinny być przechowywane w .sh
skryptach lub uruchamiane w powłoce.
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' -e '^remotes' | xargs git grep "TEXT"
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep "TEXT"
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | xargs git grep "TEXT"
git grep-branch "find my text"
:fatal: ambiguous argument 'client': both revision and filename
-a
, który pokazuje wszystkie gałęzie? Sugerowałbym użycie opcji do git branch
polecenia, aby oddzielić pręty. Patrząc na lokalne oddziały, jest tylko jeden *
, więc nie ma potrzeby uciekać przed sedem. A więc: tylko git branch | sed -e 's/*/ /' | xargs git grep "TEXT"
dla oddziałów lokalnych, tylko git branch -r | grep -v -- "->" | xargs git grep "TEXT"
dla oddziałów zdalnych i git branch -a | grep -v -- "->" | xargs git grep "TEXT"
dla wszystkich oddziałów
Oto jak to robię:
git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM
Jeśli nadasz jakiemukolwiek zatwierdzeniu wartość skrótu SHA-1 git grep
, to przeszukuje je zamiast kopii roboczej.
Aby przeszukać wszystkie gałęzie, możesz pobrać wszystkie drzewa za pomocą git rev-list --all
. Połóż to wszystko z
git grep "regexp" $(git rev-list --all)
... i miej cierpliwość