Nie jest dobrym pomysłem potokowanie wyjścia git branchdo tr lub sed; git branchto porcelanowe polecenie przeznaczone do spożycia przez ludzi. Zobacz stackoverflow.com/a/3847586/2562319, aby uzyskać preferowane alternatywy.
Tak, fajnie. Przeglądając inne odpowiedzi, myślę, że odpowiedź od @errordeveloper jest najczystsza: stackoverflow.com/a/21284342/2562319 : "git grep <regexp> $ (git for-each-ref --format = '% (refname) 'refs /) "
jbyler
1
Czy istnieje sposób, aby wyświetlić nazwę oddziału, który pasuje do wyszukiwania?
franksands
63
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.
Te polecenia dziennika zawierają listę zatwierdzeń, które dodają lub usuwają podany ciąg wyszukiwania / wyrażenie regularne, (zazwyczaj) najpierw nowszy. -pOpcja 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:
Ciekawy alias. +1. Dokładniej niż w mojej odpowiedzi.
VonC
Jak sprawić, by alias działał przy wyszukiwaniu fraz? Kiedy podaję „foo bar” jako parametr, otrzymuję: fatal: ambiguous argument „bar”: nieznana wersja lub ścieżka nie znajduje się w drzewie roboczym. Użyj
znaku
Spróbuj uciec od spacji: „foo \ bar”
Garry Gomez
To powinna być oczywiście akceptowana odpowiedź;) Rozszerzyłem ją, aby wyszukiwać tylko w najnowszych gałęziach mojego projektu (Mam więcej niż 500, nie pytaj, a każdy grep zajmuje około 4 sekund, więc nie chcę ani nie potrzebuję aby przeszukać więcej niż, powiedzmy, 100 ostatnich z nich). W tym celu zaktualizowałem za git for-each-refpomocą --sort=-committerdate --count=100! Dzięki za oryginalny pomysł!
Vser
6
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 zdalnych
git grep-branch-local - Szukaj tylko w oddziałach lokalnych
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;
Brzmi nieźle, ale otrzymałem ten błąd z git grep-branch "find my text":fatal: ambiguous argument 'client': both revision and filename
nealmcb
Dlaczego zawsze używać -a, który pokazuje wszystkie gałęzie? Sugerowałbym użycie opcji do git branchpolecenia, 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
Odpowiedzi:
Pytanie „ Jak grepować (wyszukiwać) zatwierdzony kod w historii git? ” Zaleca:
To przeszukuje wszystkie zatwierdzenia, które powinny obejmować wszystkie gałęzie.
Inną formą byłoby:
Jeszcze więcej przykładów znajdziesz w tym artykule :
(zobacz alternatywę w ostatniej sekcji tej odpowiedzi poniżej)
Nie zapomnij o tych ustawieniach, jeśli je chcesz:
Ten alias też może pomóc:
Uwaga: chernjie zasugerował, że
git rev-list --all
to przesada.Aktualizacja sierpień 2016: RM zaleca w komentarzach
To jest:
źródło
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.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:
źródło
Uważam, że to najbardziej przydatne:
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:
źródło
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
GREP przy użyciu: aliasy Git
Plik ~ / .gitconfig
Polecenia należy dodawać ręcznie do
~/.gitconfig
pliku, ponieważgit config --global alias
oceniają dodawany złożony kod i psują go.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 (odbranch -a
) i * (ma to nazwa aktywnej gałęzi);grep -v -e '\\->'
- Ignoruj złożone nazwy, takie jakremotes/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;Przykład
git grep-branch-local -n getTastyCookies
-n
Prefiks numer linii do pasujących linii.Obecna struktura to:
:
- Separatordev
53
modules/factory/getters.php
function getTastyCookies($user)
GREP przy użyciu: BASH
Jak powinieneś wiedzieć: Polecenia Bash powinny być przechowywane w
.sh
skryptach lub uruchamiane w powłoce.Tylko oddziały lokalne
Tylko oddziały zdalne
Lokalne i zdalne oddziały
źródło
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 dogit 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: tylkogit branch | sed -e 's/*/ /' | xargs git grep "TEXT"
dla oddziałów lokalnych, tylkogit branch -r | grep -v -- "->" | xargs git grep "TEXT"
dla oddziałów zdalnych igit branch -a | grep -v -- "->" | xargs git grep "TEXT"
dla wszystkich oddziałówOto jak to robię:
źródło
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... i miej cierpliwość
źródło