Git - Jak oglądać historię zmian method/function?

Dlatego znalazłem pytanie o tym, jak przeglądać historię zmiany pliku, ale historia zmian w tym konkretnym pliku jest ogromna, a w rzeczywistości interesuje się tylko zmianami w konkretnej metodzie. Czy można zobaczyć historię zmian tylko dla tej konkretnej metody?

Wiem, że wymaga to git Aby przeanalizować kod i że analiza będzie różna dla różnych języków, ale reklamy metod/Funkcje wyglądają bardzo podobnie w większości języków, więc pomyślałem, że może ktoś zaimplementował tę funkcję.

Język, z którym teraz pracuję - Objective-C, ale SCM, Które używam teraz, - git, Ale byłbym zainteresowany wiedzieć, czy ta funkcja istnieje SCM/language.
Zaproszony:

Karol

Potwierdzenie od:

Najnowsze wersje.
https://git-scm.com/docs/git-log/
Studiował specjalną formę parametru
-L

:

-L. :<funcname>:<file>

Trace Ewolucja określonego zakresu liniowego
"<start>,<end>"

/lub nazwa funkcji. regex
<funcname>

/ w ciągu
<file>

. Nie możesz podać żadnych ograniczeń pathspec. Obecnie ogranicza się do spaceru począwszy od jednej zmiany, to znaczy, możesz dać tylko zero lub jeden pozytywny argument rewizji. Możesz określić tę opcję kilka razy.

...

Zamiast tego
<start>

i
<end>

zestaw
“:<funcname>”

, Następnie jest to wyrażenie regularne, które wskazuje zakres od pierwszej linii funcname, odpowiedni
<funcname>

, Do następnego wiersza funcname.
“:<funcname>”

Wyszukiwania z końca poprzedniego zakresu
-L

, Jeśli ktoś jest dostępny, w przeciwnym razie od początku pliku.
“^:<funcname>”

Wyszukaj od samego początku pliku.



Innymi słowy: jeśli zapytasz Git -
git log -L :myfunction:path/to/myfile.c

, Chętnie wydrukował historię zmian w tej funkcji.
</funcname></funcname></funcname></funcname></end></start></file></funcname></end></start></file></funcname>

Włodzimierz

Potwierdzenie od:

Za pomocą
git gui blame

Trudno jest stosować w skryptach i chociaż
git log -G

i
git log --pickaxe

może pokazać, kiedy definicja metody pojawiła się lub zniknęła, nie znalazłem żadnego sposobu, aby wymienić wszystkie zmiany wprowadzone

ciało

Twoja metoda.

Możesz jednak użyć
gitattributes

i nieruchomość
textconv

, Zebrać tę decyzję, która to sprawia. Chociaż funkcje te były pierwotnie zaprojektowane, aby pomóc Ci pracować z plikami binarnymi, pracują również tutaj.

Kluczem jest Git Usunął wszystkie linie z pliku, z wyjątkiem tych, którzy Cię interesują, przed wykonaniem jakichkolwiek operacji diff. Następnie
git log

,
git diff

I tak dalej. Zobaczysz tylko ten obszar cię interesuje.

Oto zarys tego, co robię w innym języku; Możesz dostosować go do własnych potrzeb.

Napisz krótki skrypt shell /lub inny program./, który otrzymuje jedną argumentę pliku źródłowego - i wyświetla tylko interesującą część tego pliku. /lub nic, jeśli nic nie jest interesujące/. Na przykład możesz użyć
sed

w następujący sposób:


#!/bin/sh
sed -n -e '/^int my_func//,/^}/ p' "$1"


Określ filtr Git
textconv

Dla twojego nowego scenariusza. /Aby uzyskać więcej informacji, zobacz stronę odniesienia.
gitattributes

./ Nazwa filtra i lokalizacja polecenia może być dowolna.


$ git config diff.my_filter.textconv /path/to/my_script


Powiedz mi Git Użyj tego filtra przed obliczeniem różnic dla rozważanego pliku.


$ echo "my_file diff=my_filter" >> .gitattributes


Teraz, jeśli używasz
-G.

/Zwróć uwagę na
.

/ Aby wyliczyć wszystkie zobowiązania, które wytwarzają widoczne zmiany podczas korzystania z filtra, będziesz miał te zobowiązania, które Cię interesują. Wszelkie inne parametry za pomocą procedur Git diff, Jak na przykład
--patch

, Dostaj również ten ograniczony wydajność.


$ git log -G. --patch my_file


Voila!

Jedną z przydatnych ulepszeń, które możesz zrobić, jest to, że skrypt filtrów akceptuje nazwę metody jako pierwszego argumentu. /Plik jako drugi/. Pozwala to określić nową metodę zainteresowania, po prostu dzwoniąc
git config

, i nie edytuj skryptu. Na przykład możesz powiedzieć:


$ git config diff.my_filter.textconv "/path/to/my_command other_func"


Oczywiście skrypt filtra może zrobić wszystko, co lubisz, zrobić więcej argumentów lub czegoś innego: jest duża elastyczność, która wykracza poza to, co pokazałem tutaj.

Bogusław

Potwierdzenie od:

http://git-scm.com/docs/git-log
ma opcję '- G', które mogą być używane do poszukiwania wszystkich różnic.

- G Wyszukaj różnice, dodany lub zdalny ciąg odpowiada
określony
<regex>

.

Po prostu daj mu prawo regex Nazwa funkcji, która się martwi. Na przykład,


$ git log --oneline -G'^int commit_tree'
40d52ff make commit_tree a library function
81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory
7b9c0a6 git-commit-tree: make it usable from other builtins


</regex>

Janusz

Potwierdzenie od:

Najbliższa rzecz, jaką możesz zrobić, jest określenie pozycji swojej funkcji w pliku. /Na przykład, powiedzmy, że twoja funkcja
i_am_buggy

Znajduje się w wierszach 241-263 z
foo/bar.c

/, A następnie uruchom coś w rodzaju:


git log -p -L 200,300:foo/bar.c


Otworzy się mniej /lub równoważny pager./. Teraz możesz wejść
/i_am_buggy

/lub odpowiednik twojego pagera/ I zacznij spacerować przez zmiany.

Może nawet działać, w zależności od stylu kodu:


git log -p -L /int i_am_buggy\//,+30:foo/bar.c


Ogranicza wyszukiwanie z pierwszego trafienia tego. regex /Idealnie funkcja reklamy/ do trzydziestu linii po tym. Ostateczny argument może być również wyrażeniem regularnym, chociaż wykrywanie

tego

Z pomocą wyrażeń regularnych jest bardziej złożona propozycja.

Mariusz

Potwierdzenie od:

Właściwy sposób użycia
git log -L :function:path/to/file

, Jak opisano

Dawny .

Ale poza tym, jeśli Twoja funkcja jest bardzo długa, możesz zobaczyć tylko zmiany dokonane przez różne fotoryzację/Zatwierdzać/, a nie całe linie funkcji zawartych w niezmienionej formie dla każdej fotowania/Popełnić/, co może dotyczyć tylko jednej z tych linii. Jak zwykle
diff

.

Zazwyczaj
git log

może oglądać różnice
-p

, Ale to nie działa
-L

.
Więc musisz
grep


git log -L

Pokaż tylko wiązane linie i tytuł commits/files, Kontekstualizować je. Sztuczka tutaj ma się tylko porównać terminal Kolorowe linie, dodając przełącznik
--color

, z regex. Wreszcie:


git log -L :function:path/to/file --color | grep --color=never -E -e "^/^[\[[0-9;]*[a-zA-Z]/+" -3


Zwróć uwagę na to
^[

musi być rzeczywisty, dosłowny
^[

. Możesz je wprowadzić, klikając ^V^[ w bash, to znaczy

Ctrl

+

V

,

Ctrl

+

[

. Połączyć
https://unix.stackexchange.com/a/150/292111
.

Również ostatni przełącznik
-3

Umożliwia drukowanie 3 Rzędy kontekstu wyjściowego, przed i po każdej linii dopasowania. Być może chcesz dostosować go do Twoich potrzeb.

Wiesław

Potwierdzenie od:

http://www.kernel.org/pub/soft ... .html
Pokazuje, kto po raz ostatni zmienił każdą linię pliku; Możesz określić struny, aby sprawdzić, aby uniknąć wykonywania historii rzędu poza funkcją.

Jarosław

Potwierdzenie od:

Pokaż historię funkcji
git log -L :<funcname>:<file>

, Jak pokazano w

Ex the I.
https://www.git-scm.com/docs/g ... ilegt
Jeśli nic nie pokazuje, kontakt
https://git-scm.com/docs/gitat ... _text
, Dodać coś takiego
*.java diff=java

do pliku.
.gitattributes

Aby wspierać swój język.

Pokaż historię funkcji między zobowiązaniami
git log commit1..commit2 -L :functionName:filePath


Pokaż historię przeciążonych funkcji /Może istnieć wiele funkcji o tej samej nazwie, ale z różnymi parametrami/ z
git log -L :sum\/double:filepath


</file></funcname>

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się