Gibt es ein Versionskontrollsystem, das Änderungen an einer bestimmten Methode oder Funktion anzeigen kann? [geschlossen]

11

Manchmal wäre es schön, etwas sagen zu können wie:

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

um die Änderungen anzuzeigen, die an einer bestimmten Funktion in einer Quelldatei seit dem letzten Festschreiben vorgenommen wurden, oder den vollständigen Änderungsverlauf. Meine Frage ist zweifach:

  1. Gibt es etwas, das dies tut?
  2. Wäre ein solches Werkzeug praktisch? Es müsste bei jeder Revision ein einfaches Parsen des Codes durchgeführt werden, um verschiedene Versionen der Funktion zu vergleichen. Wäre der Overhead zu hoch, um effizient zu sein?
jches
quelle
7
Die Notwendigkeit hierfür scheint ein Symptom für ein zugrunde liegendes Problem zu sein, z. B. dass Methoden zu groß sind oder Klassen nicht richtig organisiert sind, da jedes VCS, das sein Geld wert ist, Ihnen einen Unterschied in der Klasse gibt und es einfach genug ist, nach unten zu scrollen um die betreffende Methode zu suchen (oder nach ihr zu suchen), wenn die Klasse nicht zu groß ist und Sie den Code in der Methode im Kontext der gesamten Klasse sehen. Kurz gesagt, ich denke, die Methodenauflösung ist zu spezifisch.
Robert Harvey
@ Robert, das ist ein guter Punkt, und ich denke, meine Motivation zum Fragen ist teilweise auf zumindest ein wenig aufgeblähten Code zurückzuführen. Ich habe einen Fehler auf eine bestimmte Methode zurückgeführt und möchte in der Lage sein, ein Änderungsprotokoll nur für diese Methode anzuzeigen, um zu sehen, wo es kaputt gegangen ist, und es kann etwas unpraktisch sein, vollständige Unterschiede zu durchsuchen, wenn Sie es eilig haben :)
jches
4
Für den sehr seltenen Fall, in dem dies nützlich ist, ist die Blame-Funktion von TortoiseXXX ziemlich leistungsfähig. Sie können sehen, wann die letzten Änderungen an allen Zeilen in der Methode vorgenommen wurden, und mit dem rechten Rand immer wieder durch diese Änderungen zurücktreten.
pdr

Antworten:

14
  1. Soweit ich weiß, ist dies nicht der Fall. Man könnte, aber ich würde nicht erwarten, dass es Produktionsqualität ist, wenn es so wäre.
  2. Ich denke nicht, dass es praktisch ist, aber nicht aus dem Grund, den Sie aufgelistet haben. Dies ist nicht praktikabel, da das VCS sprachbewusst sein muss, um diese Art von Funktionalität zu unterstützen. Im Wesentlichen müssten Sie etwas einbetten, um den Sprachtext zu analysieren (einer der großen Schritte, die ein Compiler ausführt). Dies erhöht die zusätzliche Belastung Ihres VCS, das bereits eine ziemlich komplexe Aufgabe erledigt.
    Noch wichtiger ist jedoch, dass Sie für jede Sprache, die Sie unterstützen möchten, dasselbe tun müssen. Ein VCS, dessen Verkaufsargument nur mit C-Code funktioniert, wird nicht viel Traktion bekommen. Selbst wenn Sie alle obskuren Sprachen ignorieren, wäre es ein gewaltiges Unterfangen, selbst die Top-10-Sprachen zu unterstützen.

Und wie Robert betonte, ist es kein großer Vorteil, sofort zu einer Methode springen zu können, wenn man manuell mit dem Diff-Tool zur Methode springen muss.

unholysampler
quelle
4
Ich unterstütze den Punkt der Sprachabhängigkeit und habe viel redundanten Code
Chander Shivdasani
1
Das gleiche Argument könnte jedoch gegen Code-Hervorhebungseditoren vorgebracht werden. Sie müssen sprachbewusst sein und tatsächlich existieren. Vielleicht ist die Auszahlung jedoch etwas höher (bunte Bildschirme mit Codez!). Ich bin damit einverstanden, dass das Parsen wahrscheinlich der schwierigste Teil wäre. Es wäre jedoch nicht so schwer, die gängigsten Sprachen zu unterstützen, zumal Sie das Programm nicht vollständig analysieren müssen.
Jches
8

svn macht tatsächlich etwas in der Nähe von dem, was Sie wollen.

Sie können den folgenden Befehl verwenden:

svn diff -x -p program.c 

Der -x -p Name der Funktion 'C' wird über dem Änderungssatz angezeigt. das sieht so aus.

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

Es wird nicht gefiltert, aber Sie können grep / search, um Ihren Zweck genau zu erfüllen.

Ich denke, das ist nur für 'C' (oder C / C ++). Ich denke jedoch, wenn es eine Nachfrage gibt, würde svn es auch für andere Sprachen verfügbar machen.

Ich stimme dem Argument nicht zu, dass VCS das NICHT tun sollte. Schließlich möchten wir, dass alle IDEs oder Editoren (wie VIM, EMACS) Syntaxhervorhebungen durchführen, die für jede Sprache spezifisch sind und viele gleichzeitig unterstützen. Daher sollte VCS als Entwicklertool auch solche Funktionen unterstützen.

Natürlich dank deiner Frage, dass ich es entdeckt habe. Ich hatte es noch nie benutzt.

Dipan Mehta
quelle
1

Ohne auf Einzelheiten einzugehen, ... können Sie sich jedoch die Website von Semantic Designs und deren Produktpalette ansehen. Sie bieten einige Werkzeuge , die sind empfindlich Sprache , so zu sagen, in Ermangelung eines besseren Wortes.

Turm
quelle
-1

So zeigen Sie an, welche Revision und welcher Autor die einzelnen Zeilen einer Datei zuletzt geändert haben:

git blame filename
Ghita
quelle
1
Richtig, aber das Q fragt nach einer Möglichkeit, nach Änderungen an einer bestimmten Methode in einer Datei zu suchen. Stellen Sie sich vor, es gibt 100 Revisionen für eine bestimmte Datei, und von diesen müssen Sie diejenigen finden, die Änderungen an einer bestimmten Funktion enthalten.
Caleb
Die Versionskontrolle kennt keine Syntaxdetails und kümmert sich auch nicht um die Dateitypen.
Ghita
-1

ENVY und StORE machen das beide. Es ist interessant, dass, wie bei Monicello, das Logan Capaldo oben erwähnt hat, auch diese für Smalltalk sind.

stevek_mcc
quelle