Kiedyś usunąłem plik lub kod z pliku. Czy mogę grepować w treści (nie w komunikatach zatwierdzania)?
Bardzo złym rozwiązaniem jest grep log:
git log -p | grep <pattern>
Jednak to nie zwraca natychmiast skrótu zatwierdzenia. I bawił się git grep
bezskutecznie.
git log -S
kilofów i obwinianiu) * [Zabawa z "git log - grep"] [2] (wyszukiwanie wiadomości zatwierdzenia ) * [Zabawa z „git grep”] [3] [2]: gitster.livejournal.com/30195.html [3]: gitster.livejournal.com/27674.htmlOdpowiedzi:
Aby wyszukać treść zatwierdzenia (tj. Rzeczywiste wiersze źródła, w przeciwieństwie do komunikatów zatwierdzania itp.), Musisz:
git rev-list --all | xargs git grep <expression>
będzie działać, jeśli wystąpi błąd „Zbyt długa lista argumentów”.Jeśli chcesz ograniczyć wyszukiwanie do pewnego poddrzewa (na przykład „lib / util”), musisz przekazać to do
rev-list
podkomendy, agrep
także:Spowoduje to przejrzenie całego tekstu zatwierdzenia
regexp
.Powodem przekazania ścieżki w obu komendach jest to, że
rev-list
zwróci listę poprawek, w której miałylib/util
miejsce wszystkie zmiany , ale musisz także przejść do,grep
aby tylko wyszukiwałalib/util
.Wyobraź sobie następujący scenariusz:
grep
może znaleźć to samo<regexp>
w innych plikach, które są zawarte w tej samej wersji zwróconej przezrev-list
(nawet jeśli nie było zmian w tym pliku w tej wersji).Oto kilka innych przydatnych sposobów wyszukiwania źródła:
Wyszukaj w drzewie roboczym pasujące do wyrażenia regularnego wyrażenie regularne:
Wyszukaj w drzewie roboczym wiersze tekstu pasujące do wyrażenia regularnego regexp1 lub regexp2:
Wyszukaj w drzewie roboczym wiersze tekstu pasujące do wyrażenia regularnego regexp1 i regexp2, zgłaszając tylko ścieżki plików:
Wyszukaj w drzewie roboczym pliki, których wiersze tekstu pasują do wyrażenia regularnego regexp1 i wiersze tekstu pasującego do wyrażenia regularnego regexp2:
Wyszukaj w drzewie roboczym zmienione linie wzoru dopasowania tekstu:
Wyszukaj we wszystkich wersjach wyrażenia regularne pasujące do wyrażenia regularnego:
Wyszukaj we wszystkich wersjach między wersją 1 a wersją 2 wyrażenia regularne pasujące do wyrażenia regularnego:
źródło
sh.exe": /bin/git: Bad file number
. Odpowiedź VonC działa również z msysgit.git gc
lub sprawdź: stackoverflow.com/questions/1507463/…Powinieneś użyć opcji pickaxe (
-S
) zgit log
.Aby wyszukać
Foo
:Zobacz historię Git - znajdź utraconą linię według słowa kluczowego, aby uzyskać więcej.
Jak skomentował Jakub Narębski :
to wygląda na różnice, które wprowadzają lub usunąć instancję
<string>
. Zazwyczaj oznacza to „poprawki, w których dodałeś lub usunąłeś wiersz za pomocą„ Foo ”.--pickaxe-regex
opcja pozwala na użycie rozszerzony POSIX regex zamiast szukać sznurku. Przykład (zgit log
):git log -S"frotz\(nitfol" --pickaxe-regex
Jak skomentował Rob , w wyszukiwaniu rozróżniana jest wielkość liter - otworzył kolejne pytanie, w jaki sposób wyszukiwać wielkość liter.
źródło
git log
nieco w swoim pytaniu miał mnie mylić;)-p
flagą, aby również wyprowadzić różnicę.--branches --all
opcji wyszukiwania wszystkich repozytoriów.Mój ulubiony sposób na to jest z
git log
„s-G
opcji (dodana w wersji 1.7.4).Istnieje niewielka różnica między sposobem, w jaki opcje
-G
i-S
określają, czy zatwierdzenie pasuje:-S
Opcja zasadniczo zlicza liczbę razy swoje mecze wyszukiwania w pliku przed i po zatwierdzeniu. Zatwierdzenie jest wyświetlane w dzienniku, jeśli liczenia przed i po są różne. Nie będzie to na przykład pokazywać zatwierdzeń, w których przeniesiono linię pasującą do wyszukiwania.-G
wybraniu opcji zatwierdzenie jest wyświetlane w dzienniku, jeśli wyszukiwanie pasuje do dowolnego wiersza, który został dodany, usunięty lub zmieniony.Weź to zatwierdzenie jako przykład:
Ponieważ liczba wystąpień „cześć” w pliku jest taka sama przed zatwierdzeniem i po nim, nie będzie pasował do użycia
-Shello
. Ponieważ jednak nastąpiła zmiana dopasowania liniihello
, zatwierdzenie zostanie pokazane za pomocą-Ghello
.źródło
-p
opcję wyświetlania różnic dla każdego zatwierdzenia. Następnie, gdy dziennik jest otwarty w moim pagerze, szukam tego, czego szukam. Jeśli twój pager jestless
i tygit log -Ghello -p
, możesz pisać/hello
, naciskaćEnter
i używaćn
oraz,N
aby znaleźć następne / poprzednie wystąpienia „cześć”.-G
i Regex: Jeśli wiersz poleceń używa UTF-8, a plik, na który patrzysz, używa kodowania ISO-Latin (8 bitów),.*
zawiedzie. Na przykład mam zmianęVierter Entwurf
->Fünfter Entwurf
i chociaż'V.*ter Entwurf'
tworzy dopasowanie,'F.*ter Entwurf'
nie ma.Jeśli chcesz przeglądać zmiany kodu (zobacz, co faktycznie zostało zmienione dla danego słowa w całej historii), przejdź do
patch
trybu - znalazłem bardzo przydatną kombinację robienia:źródło
git log
może być bardziej skutecznym sposobem wyszukiwania tekstu we wszystkich gałęziach, szczególnie jeśli jest wiele dopasowań, a chcesz najpierw zobaczyć najnowsze (istotne) zmiany.Te listy poleceń dziennika zatwierdzają, które dodają lub usuwają podany ciąg wyszukiwania / wyrażenia regularnego, (ogólnie) najpierw nowsze. Ta
-p
opcja powoduje wyświetlenie odpowiedniego diff w miejscu dodania lub usunięcia wzorca, dzięki czemu można go zobaczyć w kontekście.Po znalezieniu odpowiedniego zatwierdzenia, które dodaje szukany tekst (na przykład 8beeff00d), znajdź gałęzie zawierające zatwierdzenie:
źródło
'
cytaty nie grupują szukanego ciągu jako pojedynczego argumentu. Zamiast tego'public
jest argumentem-S
, a resztę traktuje jako osobne argumenty. Nie jestem pewien, w jakim środowisku pracujesz, ale ten kontekst byłby niezbędny, aby pomóc w rozwiązaniu problemu. Sugeruję otwarcie osobnego pytania StackOverflow, jeśli jest to potrzebne, aby pomóc ci w rozwiązaniu problemu, z całym kontekstem, w jaki sposób polecenie git jest wysyłane do powłoki. Wydaje mi się, że jest wysyłany przez inne polecenie? Komentarze tutaj nie są właściwym miejscem, aby to rozgryźć.Wziąłem odpowiedź Jeeta i dostosowałem ją do systemu Windows (dzięki tej odpowiedzi ):
Zauważ, że dla mnie, z jakiegoś powodu, faktyczne zatwierdzenie, które usunęło to wyrażenie regularne, nie pojawiło się w danych wyjściowych polecenia, a raczej jedno zatwierdzenie przed nim.
źródło
--no-pager
do polecenia git na końcu>>results.txt
dla tych, którzy nie są zaznajomieni z systemem Windows ...Szukaj w dowolnej wersji, dowolnym pliku :
Szukaj tylko w niektórych podanych plikach, na przykład plikach XML:
Linie wynikowe powinny wyglądać następująco: 6988bec26b1503d45eb0b2e8a4364afb87dde7af: bla.xml: tekst znalezionej linii ...
Następnie możesz uzyskać więcej informacji, takich jak autor, data i diff, używając
git show
:źródło
Dla uproszczenia sugerowałbym użycie GUI: gitk - przeglądarka repozytorium Git . Jest dość elastyczny
Możesz przeglądać wyniki za pomocą strzałek w górę / w dół.
źródło
Dla każdego, kto próbuje to zrobić w Sourcetree , nie ma do tego bezpośredniego polecenia w interfejsie użytkownika (od wersji 1.6.21.0). Można jednak użyć poleceń określonych w zaakceptowanej odpowiedzi, otwierając okno Terminala (przycisk dostępny na głównym pasku narzędzi) i kopiując / wklejając je.
Uwaga: widok Szukaj w Sourcetree może częściowo wyszukiwać tekst. Naciśnij Ctrl+, 3aby przejść do widoku wyszukiwania (lub kliknij kartę Wyszukaj dostępną u dołu). Z prawej strony ustaw Typ wyszukiwania na Zmiany pliku, a następnie wpisz ciąg, który chcesz wyszukać. Ta metoda ma następujące ograniczenia w porównaniu do powyższego polecenia:
źródło
Ilekroć znajdę się u ciebie, używam następującego wiersza poleceń:
Wyjaśnienie:
git log
- Muszę napisać więcej tutaj; pokazuje dzienniki w kolejności chronologicznej.-S "<words/phrases i am trying to find>"
- Pokazuje wszystkie te polecenia Git, w których dowolny plik (dodany / zmodyfikowany / usunięty) zawiera słowa / frazy, które próbuję znaleźć bez symboli „<>”.--all
- Aby wymusić i przeszukać wszystkie oddziały.--oneline
- Kompresuje dziennik Git w jednym wierszu.--graph
- Tworzy wykres chronologicznie uporządkowanych zatwierdzeń.źródło
Odpowiedź Jeeta działa w PowerShell.
Poniżej przedstawiono wszystkie pliki, w dowolnym zatwierdzeniu, które zawierają
password
.źródło
Czy starasz się przeszukiwać starsze wersje kodu, aby zobaczyć, gdzie coś jeszcze istnieje?
Gdybym to robił, prawdopodobnie użyłbym git bisect . Używając dwusiecznej, możesz określić znaną dobrą wersję, znaną złą wersję i prosty skrypt, który sprawdza, czy wersja jest dobra czy zła (w tym przypadku grep, aby sprawdzić, czy szukany kod jest obecny ). Uruchomienie tego spowoduje, że kod zostanie usunięty.
źródło
Scenariusz: dokładnie wyczyściłeś swój kod używając IDE. Problem: IDE wyczyściło więcej niż powinno, a teraz kod się nie kompiluje (brakuje zasobów itp.)
Rozwiązanie:
Znajdzie plik, w którym zmieniono „text_to_find”.
Możesz teraz cofnąć tę zmianę i skompilować kod.
źródło
to poprawka do rozwiązania Jeet , więc pokazuje wyniki podczas wyszukiwania, a nie tylko na końcu (co może zająć dużo czasu w dużym repozytorium).
źródło
W moim przypadku musiałem wyszukać krótkie zatwierdzenie, a wymienione rozwiązania niestety nie działały.
Udało mi się to zrobić (wymienić token REGEX ):
źródło