Esiste un sistema di controllo della versione che può mostrare le modifiche a un metodo o una funzione specifici? [chiuso]


11

A volte sarebbe bello poter dire qualcosa del tipo:

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

per visualizzare le modifiche apportate a una funzione specifica all'interno di un file di origine dall'ultimo commit o la cronologia completa delle modifiche. La mia domanda è duplice:

  1. Esiste qualcosa che fa questo?
  2. Uno strumento del genere sarebbe pratico? Dovrebbe fare qualche semplice analisi del codice ad ogni revisione per confrontare le diverse versioni della funzione; il sovraccarico sarebbe troppo per essere efficiente?

7
La necessità di questo sembra essere un sintomo di un problema di fondo, come metodi troppo grandi o classi non adeguatamente organizzate, poiché qualsiasi VCS degno del suo sale ti darà un diff della classe ed è abbastanza facile scorrere verso il basso a (o cercare) il metodo in questione se la classe non è troppo grande e puoi vedere il codice nel metodo nel contesto dell'intera classe. In breve, penso che la risoluzione del metodo sia troppo specifica.
Robert Harvey,

@Robert è un buon punto, e penso che la mia motivazione per chiedermi sia in parte dovuta ad almeno un po 'di codice. Ho rintracciato un bug in un metodo specifico e voglio essere in grado di vedere un registro delle modifiche apportate solo a quel metodo per vedere dove si è rotto, e le differenze complete possono essere leggermente scomode da cercare se hai fretta :)
jches

4
Nel caso molto raro in cui ciò sia utile, la funzione Blame di TortoiseXXX è piuttosto potente. Puoi vedere quando sono state apportate le ultime modifiche a tutte le righe del metodo e, usando il margine destro, continuare a tornare indietro tra le modifiche.
pdr

Risposte:


14
  1. Per quanto ne so, non lo è. Uno potrebbe, ma non mi aspetterei che fosse la qualità della produzione se lo facesse.
  2. Non penso sia pratico, ma non per il motivo che hai elencato. Non è pratico perché il VCS dovrebbe essere consapevole del linguaggio per supportare quel tipo di funzionalità. In sostanza, dovresti incorporare qualcosa per analizzare il testo in lingua (uno dei grandi passi che un compilatore fa). Questo aggiunge molto peso extra al tuo VCS, che sta già facendo un lavoro abbastanza complesso.
    Ma soprattutto, dovresti fare la stessa cosa per ogni lingua che desideri supportare. Un VCS che vende punti vendita funziona solo con il codice C non otterrà molta trazione. Anche se ignori tutte le lingue oscure, sarebbe un'impresa enorme supportare anche le prime 10 lingue.

E come ha sottolineato Robert, essere in grado di saltare immediatamente a un metodo non è un enorme vantaggio rispetto al dover saltare manualmente al metodo all'interno dello strumento diff.


4
Secondo il punto della dipendenza dalla lingua e avere un sacco di codice ridondante
Chander Shivdasani,

1
Lo stesso argomento potrebbe essere fatto contro gli editor di evidenziazione del codice; devono essere consapevoli della lingua ed effettivamente esistono. Forse il payoff è un po 'più alto (schermi colorati di codez!). Sono d'accordo che l'analisi sarebbe probabilmente la parte più difficile. Tuttavia, non sarebbe così difficile supportare le lingue più comuni, soprattutto perché non è necessario analizzare completamente il programma.
jches

8

svn in realtà fa qualcosa di simile a quello che vuoi.

Puoi usare il comando:

svn diff -x -p program.c 

Il -x -p fornisce 'C' nome della funzione sulla parte superiore del set di cambiamento. che assomiglia a questo.

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

Non filtra ma puoi grep / search per servire da vicino il tuo scopo.

Immagino che questo sia solo per 'C' (o C / C ++). Tuttavia, immagino, se c'è una richiesta svn lo renderebbe disponibile anche per altre lingue.

Non sottoscrivo del tutto l'argomento secondo cui VCS NON dovrebbe farlo. Dopotutto, vogliamo che tutti gli IDE o i redattori (come VIM, EMACS) eseguano l'evidenziazione della sintassi specifica per ogni lingua e ne supportino molte contemporaneamente. Pertanto, essendo VCS uno strumento di sviluppo, dovrebbe supportare tale funzionalità.

Certo, grazie alla tua domanda che l'ho scoperto. Non l'avevo mai usato prima.


1

Senza entrare nei dettagli, ... ma potresti dare un'occhiata al sito Semantic Designs e alla loro gamma di prodotti. Offrono alcuni strumenti che sono sensibili al linguaggio , per così dire, in mancanza di un termine migliore.



-1

Per mostrare quale revisione e autore hanno modificato l'ultima riga di ogni riga di un file:

git blame filename

1
Vero, ma la Q chiede un modo per cercare le modifiche a un particolare metodo all'interno di un file. Immagina che ci siano 100 revisioni per un dato file e tra quelle che devi trovare quelle che includono le modifiche a una particolare funzione.
Caleb,

Il controllo della versione non è a conoscenza dei dettagli della sintassi e inoltre non si preoccupa dei tipi di file.
Ghita,

-1

ENVY e STORE lo fanno entrambi. È interessante notare che, come nel caso di Monicello che Logan Capaldo ha menzionato sopra, anche questi sono per Smalltalk.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.