git log -G<regex> -p
to wspaniałe narzędzie do przeszukiwania historii bazy kodów w poszukiwaniu zmian pasujących do określonego wzorca. Jednak zlokalizowanie odpowiedniego przystojniaka na wyjściu diff / patch w morzu głównie nieistotnych przystani może być przytłaczające.
Oczywiście możliwe jest przeszukanie wyjściowego git log
ciągu / wyrażenia regularnego, ale to niewiele robi, aby zredukować wizualny szum i rozproszenie wielu niepowiązanych zmian.
Czytając dalej git log
, widzę, że jest to --pickaxe-all
, co jest dokładnym przeciwieństwem tego, czego chcę: poszerza wyjście (do całego zestawu zmian), podczas gdy chcę je ograniczyć (do określonego przystojniaka).
Zasadniczo szukam sposobu na „inteligentne” parsowanie pliku różnicowego / łaty do poszczególnych przystojniaków, a następnie przeprowadzenie wyszukiwania dla każdego przystojniaka (celowanie tylko w zmienione linie), odrzucenie kawałków, które nie pasują, i wysłanie tych to robi.
Czy istnieje takie narzędzie, jakie opisuję? Czy istnieje lepsze podejście do uzyskania pasujących / dotkniętych porcji?
Niektóre wstępne badania, które przeprowadziłem ...
Gdyby było to możliwe w
grep
przypadku wyjścia diff / patch i uczynienie wartości opcji kontekstowych dynamicznymi - powiedzmy, przez wyrażenia regularne zamiast zliczania linii - może to wystarczyć. Alegrep
nie jest zbudowany w ten sposób (niekoniecznie wymagam tej funkcji).Znalazłem pakiet patchutils , który początkowo wydawał się odpowiedni dla moich potrzeb. Ale po przeczytaniu jego
man
stron narzędzia wydają się nie obsługiwać pasujących fragmentów na podstawie wyrażeń regularnych. (Mogą zaakceptować listę przystojniaków, choć ...)W końcu natknąłem się na splitpatch.rb , który wydaje się dobrze radzić sobie z parsowaniem łatki, ale trzeba by go znacznie rozszerzyć, aby obsługiwać łatki do czytania
stdin
, dopasowując pożądane fragmenty, a następnie generując fragmenty.
Odpowiedzi:
tutaj /programming//a/35434714/5305907 opisano sposób robienia tego, czego szukasz. efektywnie:
git diff -U1 | grepdiff 'console' --output-matching=hunk
Pokazuje tylko fragmenty pasujące do podanego ciągu „konsola”.
źródło
grepdiff
jest w zasadzie tym, czego chcę; musiałem przegapić opcję dopasowywania przystojniaków! jednakże ... informacje git commit są usuwanegrepdiff
, więc po zlokalizowaniu odpowiedniego przystawki musisz rozpoznać zatwierdzenie sha z obiektu / obiektu blob sha w nagłówku diff - dość kosztowna operacja. (patrz stackoverflow.com/a/223890/2284440 ) byłoby to coś w rodzajugit find-object SHA --reverse | head -1 | cut -c 1-7 | { read sha ; git log -1 $sha; }
grepdiff
która jest bardziej oklepana pod względem przyjętych argumentów. zwróć uwagę, że gdy dopasowany przystojniak jest ostatnim przystojniakiem w pliku różnicowym, niepoprawnie zawiera nagłówek git commit następnego zatwierdzenia - coś, co całkowicie mnie pomieszało, dopóki nie zdałem sobie sprawy, co się dzieje!Niezupełnie to, o co prosisz, ale jednym ze sposobów na przechodzenie między kawałkami jest tryb dodawania interaktywnego. Wymaga to sprawdzenia zatwierdzenia po łatce, którą jesteś zainteresowany
następnie cofnij się o jeszcze jeden krok w VCS, ale nie w katalogu roboczym
(W tym momencie różnica między indeksem a katalogiem roboczym będzie odpowiadać łatce, którą jesteś zainteresowany.)
Możesz teraz wykonać
git add -p
. To uruchomi interaktywną sesję z/
opcją, która pozwala zlokalizować przystojniaki, w których niektóre wiersze pasują do wyrażenia regularnego. Jest to szczególnie przydatne, jeśli chcesz dalej przetwarzać te łatki (np. Przygotować częściowy wybór wiśni).Niestety, przynajmniej w tej chwili
/
polecenieadd -p
działa tylko w obrębie jednego pliku, więc może być konieczne pominięcie kilku niepotrzebnych plików.źródło
Opierając się na powyższej odpowiedzi @nagu i innych połączonych odpowiedziach, udało mi
git log -G
się wyświetlić tylko odpowiednie fragmenty.Najpierw utwórz skrypt gdzieś w $ PATH z tą zawartością:
Zadzwoń
git log -G
i powiedz Gitowi, aby używałpickaxe-diff
skryptu jako zewnętrznego sterownika różnicowego:Spowoduje to użycie skryptu kilof-diff tylko do wygenerowania różnic, więc reszta danych
git log
wyjściowych (skrót mieszania, komunikat itp.) Pozostanie nietknięta.Ostrzeżenie
Sposób, w jaki działa kilof Gita, polega na tym, że ogranicza on dane wyjściowe do plików, których porcje zmieniają podany ciąg / wyrażenie regularne. Oznacza to, że jeśli inny przystojniak w tych plikach również zawiera szukany ciąg / wyrażenie regularne, ale go nie zmienia, nadal będzie wyświetlany z powyższym skryptem. Jest to ograniczenie grepdiff. W projekcie patchutils jest otwarte żądanie ściągnięcia, aby dodać
--only-matching
flagę do grepdiff, co zapewniłoby niezbędną funkcjonalność, aby poprawnie odfiltrować te porcje.W tym artykule napisałem swoje rozwiązanie .
źródło