Verlauf der Änderungen an einer bestimmten Codezeile in Subversion

78

Ist es möglich, den Verlauf von Änderungen an einer bestimmten Codezeile in einem Subversion-Repository anzuzeigen?

Ich möchte zum Beispiel sehen können, wann eine bestimmte Anweisung hinzugefügt oder wann diese Anweisung geändert wurde, auch wenn ihre Zeilennummer nicht mehr dieselbe ist.

Lindelof
quelle

Antworten:

55

Ich kenne keine Methode zum zeitlichen Verfolgen von Anweisungen in Subversion.

Es ist jedoch einfach zu erkennen, wann eine bestimmte Zeile in einer Datei zuletzt mit geändert wurde svn blame. Überprüfen Sie das SVNBook: svn blameReferenz :

Zusammenfassung

svn blame TARGET[@REV]...

Beschreibung

Zeigen Sie Autoren- und Revisionsinformationen für die angegebenen Dateien oder URLs an. Jede Textzeile wird am Anfang mit dem Autor (Benutzername) und der Revisionsnummer für die letzte Änderung dieser Zeile versehen.

morechilli
quelle
2
Sie haben das Problem des OP gelöst, aber ich frage mich immer noch, ob es eine Möglichkeit gibt, den Verlauf für eine bestimmte Zeile zu verfolgen - wenn zu viele Zeilen und zu viele Revisionen vorhanden sind, um sie manuell durchzusehen.
JohnK
1
Viele GUI-Tools, z. B. tortoiseSVN (unter Windows), bauen diese Funktionalität gut auf, damit Sie die Geschichte durchgehen können. Markieren Sie in der Regel alle benachbarten Zeilen, die sich gemeinsam geändert haben, und erleichtern Sie das Betreten dieses Unterschieds. Nehmen Sie dann die entsprechende Zeilennummer aus der früheren Überarbeitung und wiederholen Sie den Vorgang. Ich habe glücklich und schnell große Repos (> 10 Jahre alt) durchgesehen, die Migrationen von CVS und sogar das Klonen von Repositorys zum Ausschneiden und Einfügen als Teil der Geschichte beinhalteten. Für mehr Automatisierung könnten Sie das Repo vielleicht in Git importieren und seine erweiterte inhaltsbasierte Schuldfunktion verwenden.
Morechilli
46

Im TortoiseSVN- Client gibt es eine sehr schöne Funktion, mit der Sie:

  • Beschuldigen Sie eine Datei und zeigen Sie die letzte Änderung für jede Zeile an (dies ist Standard).
  • "Vorherige Revision beschuldigen", nachdem Sie in der obigen Ansicht auf eine bestimmte Zeile geklickt haben (dies ist die gute)

Das zweite Feature macht das, was es sagt - es zeigt die kommentierte Revision vor der letzten Änderung der Zeile. Wenn Sie diese Funktion iterativ verwenden, können Sie den Verlauf einer bestimmten Zeile zurückverfolgen.

Rafał Dowgird
quelle
Was ist, wenn die Schuld nicht die Linie zeigt? Ich habe den Fall, dass ich nach der Änderung einer bestimmten Zeile suche. Benutzte Schildkröte-> Schuld Lassen Sie Revision auf spätere Revision. In der Datei kann ich eine bestimmte Zeile sehen, in Schuld kann ich sie nicht finden.
Offler
13

Ich würde normalerweise:

  1. svn blame FILEZuerst ausführen .
  2. Beachten Sie die letzte Überarbeitung der jeweiligen Zeile.
  3. Führen Sie eine weitere Abfrage mit dem -rArgument durch:

    svn blame FILE -r 1:REV
    
  4. Von dort manuell verfolgen.
atedja
quelle
Sie können 1. und 2. insvn annotate $file_path | head -n$line_no | tail -1 | awk '{print $1}'
hardmooth
5

Dies kann in zwei Schritten erfolgen:

  1. svn blame /path/to/your/file > blame.tmp
  2. grep "your_line_of_text" blame.tmp

Sie können die Datei tad.tmp anschließend löschen, wenn Sie sie nicht benötigen.

Grundsätzlich kann ein einfaches Skript in jeder Skriptsprache geschrieben werden, die ungefähr dasselbe tut.

Serge Kutny
quelle
Sie müssen dies nicht tun. Dies kann über den Editor selbst erfolgen, z. B. verwende ich VCSAnnotate von vim. und es teilt und zeigt die Schuldausgabe, ohne den vim-Editor zu verlassen. Andere Editoren haben ähnliche Plugins
KeshV
2

Der Schlüssel hier ist, wie viel Geschichte benötigt wird. Wie andere betont haben, lautet die kurze Antwort: svn blame(siehesvn help blame Einzelheiten ). Wenn Sie weit in die Vergangenheit zurückreichen oder sich mit wesentlichen Änderungen befassen, benötigen Sie wahrscheinlich mehr als nur diesen einen Befehl.

Ich musste das nur selbst machen und fand diesen (ye ole) Thread hier auf SO. Hier ist, was ich getan habe, um es mit nur dem zu lösen CLI, speziell für meinen Fall, in dem sich eine API geändert hatte (z. B. während die weit veraltete Arbeit einer Person (nicht auf einem Zweig, arrgh! ) Zurück in einen Feature-Zweig portiert wurde , der auf einem bis zu Datumsstamm). ZB hatten sich die Funktionsnamen so weit geändert, dass nicht ersichtlich war, welche Funktion aufgerufen werden musste.

Schritt eins

Mit dem folgenden Befehl konnte ich durch Commits blättern, bei denen sich in der Datei "fileName.h" Änderungen ergeben hatten, und die entsprechende Versionsnummer anzeigen (Hinweis: Möglicherweise müssen Sie die '10' für mehr oder weniger Kontext gemäß Ihrem SVN-Protokolltext ändern ).

svn log | grep -C 10 "fileName.h" | less

Dies führt zu einer Liste von Revisionen, in denen diese Datei geändert wurde.

Schritt zwei

Dann war es eine einfache Sache, blame(oder wie andere betont haben annotate) zu verwenden, um sich auf die Revisionen des Interesses zu beschränken.

cd trunk
svn blame fileName.h@r35948 | less

ZB fand die Revision des Interesses 35948.

Schritt drei

Nachdem die interessierende (n) Revision (en) über die Schuld gefunden wurden, kann ein Diff erstellt werden, um das SVN-Tool zu nutzen.

svn diff -r35948:PREV fileName.h

Fazit

Ein visueller Unterschied machte es viel einfacher, die alten API-Namen mit den neueren / aktualisierten API-Namen zu identifizieren.

tniles
quelle
Wenn Sie Glück haben und mit Code arbeiten, der gute Festschreibungsnachrichten im Protokoll enthält, können Sie in meinem speziellen Szenario möglicherweise sogar nach grepdem alten API- / Funktionsnamen suchen und einen Kommentar finden, der etwa " func_FindParm in func_GetParm geändert " enthält. .
tniles
2

In Eclipse können Sie mithilfe der SVN-Annotationsansicht feststellen, wann jede Zeile Ihres Codes festgeschrieben wurde, oder mit der rechten Maustaste auf die Datei → TeamAnnotation anzeigen ... klicken .

Youssef NAIT
quelle
0

svn tad zeigt Ihnen, welches Check-in beim letzten Mal eine Zeile in einer Datei geändert hat.

Dies funktioniert auch bei alten Revisionen.

Maximilian
quelle
0

Ein Start ist der Befehl svn tadeln (oder kommentieren, loben). Es zeigt Ihnen, wann eine Codezeile zuletzt geändert wurde und von wem sie geändert wurde. z.B:

  4564    wiemann # $Id$
  4564    wiemann # Author: David Goodger <[email protected]>
   778    goodger # Copyright: This module has been placed in the public domain.
   217    goodger 
Peter Hoffmann
quelle
0

Wenn Sie Emacs verwenden, kann das integrierte Paket vcdies tun.

  1. Navigieren Sie zu der betreffenden Datei.
  2. Führen Sie den Befehl vc-annotatemit entweder M-x vc-annotateoder aus C-xvg.
  3. Jede Zeile wird wie normal mit ihrer Revision angezeigt svn blame.
  4. Durch Drücken von a( vc-annotate-revision-previous-to-line) wird zur Revision vor der Revision in der Zeile navigiert, in der Sie sich befinden.
Harrison Mc
quelle