Czy istnieje sposób na wykluczenie pewnych ścieżek / katalogów / plików podczas przeszukiwania repozytorium git przy użyciu git grep
? Coś podobnego do --exclude
opcji w normalnym grep
poleceniu?
Muszę użyć, git grep
ponieważ używanie grep
bezpośrednio działa zbyt wolno w dużych repozytoriach git.
Odpowiedzi:
Nie jest to możliwe, ale ostatnio zostało omówione . Proponowane obejście w linku:
EDYTUJ zobacz tylko brak odpowiedzi , od git 1.9.0 jest to możliwe.
źródło
W git 1.9.0 "magiczne słowo"
exclude
zostało dodane dopathspec
s. Więc jeśli chcesz szukaćfoobar
w każdym pliku oprócz tych pasujących*.java
, możesz zrobić:Lub używając
!
„krótkiego formularza” do wykluczania:Zwróć uwagę, że w wersjach git do wersji 2.12, gdy używasz wykluczenia
pathspec
, musisz mieć co najmniej jedną opcję „włączającą”pathspec
. W powyższych przykładach jest to./*
(rekursywnie dołączaj wszystko w bieżącym katalogu). W git v2.13 to ograniczenie zostało zniesione igit grep foobar -- ':!*.java'
działa bez rozszerzenia./*
.Możesz również użyć czegoś takiego jak
:(top)
(krótka forma:/
:), aby uwzględnić wszystko od góry repozytorium. Ale wtedy prawdopodobnie chciałbyś również dostosować wykluczenie,pathspec
aby również rozpoczynał się od góry::/!*.java
(w przeciwnym razie wykluczałoby to tylko*.java
pliki z bieżącego katalogu).Jest dobrym punktem odniesienia dla wszystkich „magicznych słów” w sposób dozwolony
pathspec
na git-scm.com (lub tylkogit help glossary
). Z jakiegoś powodu dokumenty na kernel.org są naprawdę nieaktualne, mimo że często pojawiają się jako pierwsze w wyszukiwaniach Google.źródło
git grep clock.gettime -- './*' ':!arch/**' ':!drivers/**'
aby wykluczyć wiele całych katalogów. Nie sądzę jednak, aby zapobiegało to rekursji.git config alias.mygrep '!git grep "$@" -- "${GIT_PREFIX}/*" ":!*.java*" #'
. Wtedy po prostugit mygrep foobar
. (Używając aliasu shell # trick i bieżącego reż .)git grep
igit ls-files
z podkatalogów i oba raportują nazwy plików względem bieżącego katalogu (nawet jeśli używasz':(top)'
ścieżki dołączania). Oba polecenia mają--full-name
opcję zgłaszania nazw względem katalogu głównego, ale jest to domyślnie wyłączone.Aktualizacja: dla git> = 1.9 istnieje natywna obsługa wzorców wykluczania, zobacz odpowiedź onlyone .
Może się to wydawać odwrotne, ale możesz przekazać listę plików, które nie pasują do wzorca wykluczania, w
git grep
ten sposób:grep -v
zwraca każda ścieżka nie pasujące<exclude-pattern>
. Zauważ, żegit ls-files
również pobiera--exclude
parametr, ale jest on stosowany tylko do nieśledzonych plików .źródło
Możesz oznaczyć pliki lub katalogi jako binarne, tworząc plik atrybutów w swoim repozytorium, np
Dopasowania w plikach binarnych są wymienione bez linii włączającej, np
źródło
Z przykładem @kynan jako bazą utworzyłem ten skrypt i umieściłem go w mojej path (
~/bin/
) jakogg
. Używa,git grep
ale unika niektórych określonych typów plików.W naszym repozytorium jest dużo obrazów, więc wykluczyłem pliki obrazów, a to skraca czas wyszukiwania do 1/3, jeśli przeszukam całe repozytorium. Ale skrypt można łatwo zmodyfikować, aby wykluczyć inne typy plików lub wzorce geleral.
Notatka 1
W związku z tym powinno być możliwe nazwanie rzeczy
git-gg
i wywołanie jej jako zwykłej komendy git, takiej jak:Ale nie mogę uruchomić tego. Utworzyłem skrypt w moim
~/bin/
i utworzyłemgit-gg
łącze symboliczne w/usr/lib/git-core/
.Uwaga 2
Polecenie nie może zostać przekształcone w zwykły
sh
alias git, ponieważ zostanie wywołane w katalogu głównym repozytorium. A nie tego chcę!źródło