web-dev-qa-db-de.com

Wie kann ich alle historischen Änderungen an einer Datei in SVN anzeigen

Ich weiß, dass ich svn diff -r a:b repo die Änderungen zwischen den zwei angegebenen Versionen anzeigen kann. Was ich möchte, ist ein Diff für jede Revision, die die Datei geändert hat. Ist ein solcher Befehl verfügbar?

158
Gordon Wilson

Es gibt keinen integrierten Befehl dafür, daher mache ich normalerweise einfach so etwas:

#!/bin/bash

# history_of_file
#
# Outputs the full history of a given file as a sequence of
# logentry/diff pairs.  The first revision of the file is emitted as
# full text since there's not previous version to compare it to.

function history_of_file() {
    url=$1 # current url of file
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -n | {

#       first revision as full text
        echo
        read r
        svn log -r$r [email protected]
        svn cat -r$r [email protected]
        echo

#       remaining revisions as differences to previous revision
        while read r
        do
            echo
            svn log -r$r [email protected]
            svn diff -c$r [email protected]
            echo
        done
    }
}

Dann können Sie es aufrufen mit:

history_of_file $1
175
bendin

Etwas anders als das, was Sie beschrieben haben, aber ich denke, das könnte das sein, was Sie tatsächlich brauchen:

svn blame filename

Es wird die Datei mit jeder Zeile gedruckt, die mit dem Zeitpunkt und dem Autor des Commits versehen ist, der sie zuletzt geändert hat.

138
ngn

Wenn Sie den gesamten Verlauf einer Datei mit Codeänderungen anzeigen möchten:

svn log --diff [path_to_file] > log.txt
82
emilie zawadzki

Sie können git-svn verwenden, um das Repository in ein Git-Repository zu importieren, und dann git log -p filename verwenden. Dies zeigt jeden Protokolleintrag für die Datei, gefolgt vom entsprechenden Diff.

37
Greg Hewgill

Beginnen mit

svn log -q file | grep '^r' | cut -f1 -d' '

Dadurch erhalten Sie eine Liste der Revisionen, bei denen sich die Datei geändert hat. Diese können Sie dann verwenden, um wiederholte Aufrufe von svn diff per Skript auszuführen.

18
Jack

Der seltsam benannte Befehl "blame" führt dies aus. Wenn Sie Tortoise verwenden, wird ein Dialogfeld "Von Revision" angezeigt. Anschließend wird eine Dateiliste mit einer Zeile für Zeile mit der Versionsnummer und dem Autor daneben angezeigt.

Wenn Sie mit der rechten Maustaste auf die Versionsinformationen klicken, können Sie ein Dialogfeld "Protokoll anzeigen" anzeigen, in dem vollständige Informationen zum Einchecken sowie andere Dateien angezeigt werden, die Teil des Eincheckvorgangs waren.

8
goosemanjack

Soweit ich weiß, gibt es keinen eingebauten svn-Befehl, um dies zu erreichen. Sie müssen ein Skript schreiben, um mehrere Befehle auszuführen, um alle Unterschiede zu erstellen. Ein einfacherer Ansatz wäre die Verwendung eines GUI-SVN-Clients, falls dies eine Option ist. Viele davon, wie das subversive Plugin für Eclipse, listen den Verlauf einer Datei auf und ermöglichen es Ihnen, den Unterschied jeder Revision anzuzeigen.

3
D-Rock

Danke, Bendin. Ich mag deine Lösung sehr.

Ich habe es geändert, um in umgekehrter Reihenfolge zu arbeiten. Zuerst wurden die letzten Änderungen angezeigt. Was bei langjährigem Code wichtig ist und über mehrere Jahre hinweg beibehalten wird. Ich lenke es normalerweise in mehr.

svnhistory elements.py |more

Ich habe der Sortierung -r hinzugefügt. Ich entfernte Spec. Handling für 'erste Aufnahme'. Es ist ein Fehler beim letzten Eintrag, da es nichts zu ändern gibt. Ich lebe zwar damit, weil ich nie so weit runter komme.

#!/bin/bash                                                                    

# history_of_file                                                              
#                                                                              
# Bendin on Stack Overflow: http://stackoverflow.com/questions/282802          
#   Outputs the full history of a given file as a sequence of                  
#   logentry/diff pairs.  The first revision of the file is emitted as         
#   full text since there's not previous version to compare it to.             
#                                                                              
# Dlink                                                                        
#   Made to work in reverse order                                              

function history_of_file() {
    url=$1 # current url of file                                               
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -nr | {
        while read r
    do
            echo
            svn log -r$r [email protected]
            svn diff -c$r [email protected]
            echo
    done
    }
}

history_of_file $1
3
dlink

Ich habe bei der Erforschung dieses Themas eine Reihe von Teilantworten gesehen. Das hat für mich funktioniert und ich hoffe, es hilft anderen. Dieser Befehl zeigt die Ausgabe in der Befehlszeile mit der Versionsnummer, dem Autor, dem Versionszeitstempel und den vorgenommenen Änderungen an:

svn blame -v <filename>

Um die Suche zu vereinfachen, können Sie die Ausgabe in eine Datei schreiben und nach dem suchen, was Sie suchen.

0
alamba