Korzystając z Git, jak mogę przeszukiwać wszystkie pliki we wszystkich gałęziach lokalnych dla danego ciągu?
Specyficzne dla GitHub: czy można przeprowadzić powyższe wyszukiwanie we wszystkich oddziałach GitHub? (W moim zdalnym repozytorium GitHub jest kilka zdalnych oddziałów, których idealnie nie musiałbym opuszczać podczas tego wyszukiwania ...)
Odpowiedzi:
Możesz to zrobić w repozytorium Git:
Zaawansowane wyszukiwanie GitHub ma możliwość wyszukiwania kodu:
Wyszukiwanie kodu przejrzy cały kod publicznie hostowany na GitHub. Możesz też filtrować według:
language:
repo:
path:
źródło
git grep ...
. Spójrz na inne odpowiedzi, są znacznie lepsze niż ta, mimo że jest oznaczona jako zaakceptowana!path:
ponieważ dokumentacja na pierwszy rzut oka nie wygląda jasno, gdzie zastosować ten filtr, zakładam, że jest on przed cudzysłowami w przykładzie zapytania?Jeśli użyjesz polecenia @manojlds Git grep i pojawi się błąd:
wtedy powinieneś użyć xargs :
Zobacz także Jak grep (przeszukiwać) zatwierdzony kod w historii Git
źródło
W wielu przypadkach
git rev-list --all
może zwrócić ogromną liczbę zatwierdzeń, a skanowanie trwa wieczność. Jeśli zamiast przeszukiwać wszystkie zmiany w każdej gałęzi w historii repozytorium, chcesz po prostu przeszukać wszystkie wskazówki dotyczące gałęzi, możesz je zastąpićgit show-ref --heads
. Więc w sumie:lub:
Porada: Możesz zapisać dane wyjściowe w pliku, aby wyświetlić je w edytorze:
źródło
git show-ref --heads
wyświetla hash i nazwę odniesienia, więc (druga linia) przeszuka dwukrotnie. więcgit show-ref --heads | cut -d' ' -f2
jest lepsze, ponieważ wyświetli tylko nazwy referencyjne.git show-ref --heads -s
wyświetla tylko skrót SHA1. Ponadto, jeśli istnieje wiele gałęzi wskazujących na to samo zatwierdzenie, będziesz mieć duplikaty. Możesz je usunąćsort -u
, na przykładgit show-ref --heads -s | sort -u | xargs git grep ...
function gsearch { git grep $1 $(git show-ref --heads) | grep "refs/heads" | grep $1 } # last grep to keep grep color highlight
Istnieje kilka problemów z rozwiązaniami wymienionymi tutaj (nawet zaakceptowanymi).
Nie musisz wymieniać wszystkich skrótów, ponieważ otrzymasz duplikaty. Ponadto zajmuje to więcej czasu.
Opiera się na tym, gdzie można wyszukiwać ciąg
"test -f /"
w wielu gałęziachmaster
idev
jakoktóry jest taki sam jak
Więc oto idzie.
Znajduje skróty końcówek wszystkich lokalnych oddziałów i wyszukuje tylko w tych zatwierdzeniach:
Jeśli chcesz szukać również w zdalnych oddziałach, dodaj
-a
:Dalej:
źródło
git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string"
lub zakończy się niepowodzeniem z->
symbolem na liście plików, co oznacza relację oddziałów lokalnych do zdalnychMożesz spróbować tego:
źródło
git log --all -s"search_string"