Mam repozytorium Git z kilkoma gałęziami i zwisającymi zatwierdzeniami. Chciałbym przeszukać wszystkie takie zatwierdzenia w repozytorium w poszukiwaniu określonego ciągu.
Wiem, jak uzyskać dziennik wszystkich zatwierdzeń w historii, ale nie obejmują one gałęzi ani wiszących obiektów BLOB, tylko historię HEAD. Chcę je wszystkie, aby znaleźć konkretne zatwierdzenie, które zostało zgubione.
Chciałbym również wiedzieć, jak to zrobić w Mercurial, ponieważ rozważam zmianę.
Odpowiedzi:
Możesz zobaczyć wiszące zatwierdzenia
git log -g
.Więc możesz to zrobić, aby znaleźć konkretny ciąg znaków w wiszącym komunikacie zatwierdzenia:
Alternatywnie, jeśli chcesz wyszukać zmiany dla określonego ciągu, możesz użyć opcji wyszukiwania kilofu, „-S”:
Git 1.7.4 doda opcję -G , umożliwiając przekazanie -G <regexp>, aby dowiedzieć się, kiedy została przeniesiona linia zawierająca <regexp>, czego nie można zrobić -S. -S powie ci tylko, kiedy zmieni się łączna liczba wierszy zawierających ciąg znaków (tj. Dodanie / usunięcie ciągu).
Na koniec możesz użyć gitk do wizualizacji wiszących zatwierdzeń za pomocą:
Następnie użyj jego funkcji wyszukiwania, aby znaleźć zgubiony plik. Wszystkie te prace zakładają, że brakujące zatwierdzenie nie „wygasło” i zostało wyrzucone do pamięci, co może się zdarzyć, jeśli zwisają przez 30 dni i wygasają ponowne rejestrowania lub uruchamiane jest polecenie, które je wygasa.
źródło
!git fsck --unreachable | sed -ne 's/^unreachable commit //p' | xargs git log --no-walk
W Mercurial używasz
hg log --keyword
do wyszukiwania słów kluczowych w komunikatach zatwierdzeń ihg log --user
do wyszukiwania konkretnego użytkownika. Zobaczhg help log
inne sposoby ograniczenia dziennika.źródło
hg log -k
wyszukiwania zatwierdzają nazwy użytkownika i nazwy plików również w zestawach zmian (widzę to w komendach.py:log), co jest jedną z niewielu rzeczy, których nie rozumiem w hg. Powinny istnieć oddzielne opcje wyszukiwania w komunikatach zatwierdzania i nazwach plików. Wydaje się, żehg log --template '{desc}\n'|grep
to pewny sposób.hg grep --all <term>
Oprócz odpowiedzi richq na temat używania
git log -g --grep=<regexp>
lubgit grep -e <regexp> $(git log -g --pretty=format:%h)
: spójrz na następujące posty na blogu autorstwa Junio C Hamano, obecnego opiekuna gitPodsumowanie
Zarówno git grep, jak i git log --grep są zorientowane liniowo , ponieważ szukają linii pasujących do określonego wzorca.
Możesz użyć
git log --grep=<foo> --grep=<bar>
(lubgit log --author=<foo> --grep=<bar>
to wewnętrznie tłumaczy na dwa--grep
), aby znaleźć zatwierdzenia, które pasują do któregoś z wzorców (niejawne LUB semantyczne).Ze względu na to, że jest zorientowany na linię, przydatny semantyczny AND służy
git log --all-match --grep=<foo> --grep=<bar>
do znalezienia zatwierdzenia, które ma gdzieś zarówno dopasowanie do pierwszej linii, jak i dopasowanie do drugiej linii.Z
git grep
można połączyć wiele wzorców (wszystkie, które muszą korzystać z-e <regexp>
formularza) z--or
(który jest domyślny),--and
,--not
,(
i)
. Dla grep--all-match
oznacza, że plik musi mieć linie pasujące do każdej z alternatyw.źródło
Opierając się na odpowiedzi rq, zauważyłem, że ta linia robi to, co chcę:
Który zgłosi identyfikator zatwierdzenia, nazwę pliku i wyświetli pasującą linię, jak poniżej:
... Czy ktoś zgadza się, że byłoby to fajną opcją do włączenia do standardowego polecenia git grep?
źródło
Każde polecenie, które przyjmuje odwołania jako argumenty, zaakceptuje
--all
opcję udokumentowaną na stronie podręcznika dlagit rev-list
:Na przykład
git log -Sstring --all
wyświetli wszystkie commity, które wspominająstring
i które są dostępne z gałęzi lub tagu (zakładam, że twoje wiszące commity są przynajmniej nazwane tagiem).źródło
git grep
, gdy--all
wydaje się, że zostanie przetłumaczone na / użyte jako--all-match
. Dla mnie to wygląda na błąd .. przy użyciu Git 1.7.2.3 (przy użyciu$(git rev-list --all)
utworów).Z Mercurial robisz
Istnieją inne opcje, które zawężają zakres przeszukiwanych wersji.
źródło
hg grep --all
Nie wiem o git, ale w Mercurial po prostu potokuję dane wyjściowe dziennika hg do jakiegoś skryptu sed / perl / cokolwiek, aby wyszukać to, czego szukasz. Możesz dostosować dane wyjściowe dziennika hg za pomocą szablonu lub stylu, aby ułatwić wyszukiwanie, jeśli chcesz.
Obejmie to wszystkie nazwane gałęzie w repozytorium. Mercurial nie ma czegoś takiego jak wiszące plamy afaik.
źródło
jeśli jesteś użytkownikiem vima, możesz zainstalować tig (apt-get install tig) i użyć /, to samo polecenie, aby wyszukać na vimie
https://blogs.atlassian.com/2013/05/git-tig/
źródło
Aby dodać jeszcze jedno rozwiązanie, o którym jeszcze nie wspomniano, musiałem powiedzieć, że użycie graficznego pola wyszukiwania gitga było dla mnie najprostszym rozwiązaniem. Wybierze pierwsze wystąpienie, a następne możesz znaleźć za pomocą Ctrl-G.
źródło
Jedno polecenie w git, że myślę, że o wiele łatwiej jest znaleźć ciąg:
działa w Git 2.0.4
źródło