Czy istnieje system kontroli wersji, który może pokazywać zmiany w określonej metodzie lub funkcji? [Zamknięte]

11

Czasami miło byłoby móc powiedzieć coś takiego:

(git|svn|hg|etc) diff Foo.c:main
(git|svn|hg|etc) log log Foo.c:main

aby zobaczyć zmiany dokonane w określonej funkcji w pliku źródłowym od czasu ostatniego zatwierdzenia lub pełną historię zmian. Moje pytanie jest dwojakie:

  1. Czy istnieje coś, co to robi?
  2. Czy takie narzędzie byłoby praktyczne? Będzie musiał wykonać kilka prostych analiz parsowania kodu przy każdej wersji, aby porównać różne wersje funkcji; czy koszty ogólne byłyby zbyt duże, aby były skuteczne?
jches
źródło
7
Potrzeba tego wydaje się być symptomem leżącego u podstaw problemu, takiego jak zbyt duże metody lub niewłaściwie zorganizowane klasy, ponieważ każda VCS warta swojej soli da ci różnicę klasy i łatwo jest przewinąć w dół do (lub szukania) metody, o której mowa, jeśli klasa nie jest zbyt duża, i można zobaczyć kod w metodzie w kontekście całej klasy. Krótko mówiąc, myślę, że rozdzielczość metody jest zbyt specyficzna.
Robert Harvey,
@Robert to dobry punkt i myślę, że moja motywacja do zastanawiania się jest częściowo spowodowana przynajmniej niewielkim wzdęciem kodu. Znalazłem błąd w konkretnej metodzie i chcę zobaczyć dziennik zmian tylko tej metody, aby zobaczyć, gdzie się zepsuła, a pełne różnice mogą być nieco niewygodne w wyszukiwaniu, jeśli się
spieszysz
4
W bardzo rzadkim przypadku, gdy jest to przydatne, funkcja winy TortoiseXXX jest dość potężna. Możesz zobaczyć, kiedy wprowadzono ostatnie zmiany we wszystkich wierszach metody i, korzystając z właściwego marginesu, cofaj się o kolejne zmiany.
pdr

Odpowiedzi:

14
  1. O ile mi wiadomo, tak nie jest. Można by, ale nie spodziewałbym się, że byłaby to jakość produkcji.
  2. Nie sądzę, żeby to było praktyczne, ale nie z powodu, który wymieniłeś. Nie jest to praktyczne, ponieważ VCS musiałby być świadomy języka, aby obsługiwać tego rodzaju funkcje. Zasadniczo trzeba by było osadzić coś, aby parsować tekst języka (jeden z dużych kroków kompilatora). Daje to dodatkowe obciążenie dla VCS, który już wykonuje dość złożoną pracę.
    Ale co ważniejsze, musisz zrobić to samo dla każdego języka, który chcesz obsługiwać. VCS, którego punkt sprzedaży działa tylko na kodzie C, nie uzyska dużej przyczepności. Nawet jeśli zignorujesz wszystkie niejasne języki, wsparcie nawet dla 10 najpopularniejszych języków byłoby ogromnym przedsięwzięciem.

I jak zauważył Robert, możliwość natychmiastowego przeskoczenia do metody nie jest wielkim zyskiem w porównaniu z koniecznością ręcznego przeskakiwania do metody w narzędziu różnicowym.

unholysampler
źródło
4
Drugi punkt to zależność od języka i dużo zbędnego kodu
Chander Shivdasani,
1
Ten sam argument można jednak postawić przeciwko edytorom wyróżniającym kod; muszą być świadomi języka i rzeczywiście istnieją. Może jednak wypłata jest nieco wyższa (kolorowe ekrany z kodem!). Zgadzam się, że parsowanie byłoby prawdopodobnie najtrudniejszą częścią. Jednak obsługa najpopularniejszych języków nie byłaby trudna, zwłaszcza że nie trzeba w pełni analizować programu.
skacze
8

SVN faktycznie robi coś blisko tego, co chcesz.

Możesz użyć polecenia:

svn diff -x -p program.c 

-x -p Zapewnia „c” nazwy funkcji w górnej części zestawu zmian. który wygląda tak

@@ -97,6 +102,8 @@ int function1(int *x)

Nie filtruje, ale możesz grep / search, aby ściśle służyć swojemu celowi.

Myślę, że to tylko dla „C” (lub C / C ++). Myślę jednak, że jeśli istnieje popyt, svn udostępnia go również dla innych języków.

Nie do końca zgadzam się z argumentem, że VCS NIE powinien tego robić. W końcu chcemy, aby wszystkie środowiska IDE lub edytory (takie jak VIM, EMACS) wykonywały podświetlanie składni, które jest specyficzne dla każdego języka i obsługuje wiele jednocześnie. Dlatego VCS jako narzędzie programistyczne powinno również obsługiwać taką funkcjonalność.

Oczywiście dzięki twojemu pytaniu, że je odkryłem. Nigdy wcześniej go nie używałem.

Dipan Mehta
źródło
1

Bez wchodzenia w szczegóły, ... ale możesz sprawdzić stronę Semantic Designs i ich produkty. Oferują niektóre narzędzia wrażliwe na język , że tak powiem, bez lepszego terminu.

Wieża
źródło
-1

Aby pokazać, która wersja i autor ostatnio zmodyfikowali każdą linię pliku:

git blame filename
Ghita
źródło
1
To prawda, ale Q pyta o sposób wyszukiwania zmian w określonej metodzie w pliku. Wyobraź sobie, że istnieje 100 poprawek do danego pliku i spośród tych musisz znaleźć te, które zawierają zmiany w określonej funkcji.
Caleb,
Kontrola wersji nie wie o szczegółach składni, a także nie dba o typy plików.
Ghita,
-1

ENVY i STORE robią to. Interesujące jest to, że podobnie jak w przypadku Monicello wspomnianego powyżej Logana Capaldo, one również są dla Smalltalk.

stevek_mcc
źródło