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

169

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

Gordon Wilson
quelle
16
Es ist im seltsam benannten Befehl "Schuld" versteckt.
Goosemanjack
6
Ich dachte, @goosemanjack mache Witze, bis ich es versuchte.
SSH Dies ist der

Antworten:

181

Es gibt keinen eingebauten Befehl dafür, also 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 $url@HEAD
        svn cat -r$r $url@HEAD
        echo

#       remaining revisions as differences to previous revision
        while read r
        do
            echo
            svn log -r$r $url@HEAD
            svn diff -c$r $url@HEAD
            echo
        done
    }
}

Dann können Sie es nennen mit:

history_of_file $1
Bendin
quelle
35
Ich habe diesen Trick "Piping in the Braced Block" noch nie gesehen. Ordentlich.
5
Batch-Dateiversion dieses Skripts, fwiw.
Beladung
Ich habe dies zu meiner .bashrc-Datei hinzugefügt. Wenn ich anfange, bekomme ich svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
Francisc0
1
@ Francisco0: Fügen Sie die letzte Zeile nicht in Ihren Bashrc ein. Es ist nicht Teil der Funktionsdefinition, sondern ein Aufruf der Funktion, da das angegebene Beispiel als eigenständiges Skript verwendet werden soll.
Bendin
26
svn log --diff [path_to_file]funktioniert genau so! stackoverflow.com/a/24938573/3185510
webster
143

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

svn blame filename

Die Datei wird mit jeder Zeile gedruckt, der die Zeit und der Autor des Commits vorangestellt sind, der sie zuletzt geändert hat.

ngn
quelle
4
Whoa das ist großartig! Ich benutze SVN seit Jahren und wusste nie davon: O
Ja Barry
4
Möglicherweise benötigen Sie die Option verbose / -v, um den Zeitstempel anzuzeigen (ich verwende meinen Standard-Build von svn 1.7.9).
Weston C
Mein Professor hat das anfängliche Schuld-Plugin an svn geschrieben. Ich musste das noch nachschlagen. Er füllt diese Aufgabe total selbst aus. : P
Joseph Dailey
93

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

svn log --diff [path_to_file] > log.txt
Emilie Zawadzki
quelle
3
Ich weiß nicht, wann die Option --diff hinzugefügt wurde, aber sie funktioniert mit SVN 1.8.10, sodass kein Bash-Skript erforderlich ist
Guillaume Gros
1
Ich denke, SVN 1.7.4 hat die Option eingeführt, --diffda es Tests für die Option gibt, während 1.7.3 keine hat - subversion/tests/cmdline/log_tests.py.
gültig am
Nur eine kleine Anmerkung: Abhängig von der Länge des Verlaufs kann es einige Zeit dauern, bis die Datei log.txt vollständig gerendert ist (obwohl sie sofort lesbar ist).
Ivan Durst
1
Wie beschränkt man dies auf die neuesten X-Revisionen?
Enigma
@Enigma: mit der --limit <number>Option. Wie so:svn log --diff --limit 5 [path_to_file]
Reid
37

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

Greg Hewgill
quelle
27
Git installieren, ein Git-Repository erstellen, einen Git-Befehl verwenden? Die Frage wurde markiert und nach Subversion gestellt.
Ken Gentle
21
Ich benutze git als Subversion-Client mit git-svn. So würde ich die log + diff-Operation für ein Subversion-Repository ausführen. Git hat einige wirklich hervorragende Tools für die Anzeige von Repositorys, es ist keine so ausgefallene Idee.
Greg Hewgill
10
Oben wird (zu Recht) jemand zum Schreiben eines netten Skripts beglückwünscht - um Funktionen bereitzustellen, die in SVN nicht vorhanden sind. Wenn Sie sehen, dass Git lokal ist, es sei denn, Sie drücken, können Sie dieses Tool nennen, ohne sich über Dinge aufregen zu müssen.
Adam Tolley
Dies ist auch die einzige Antwort, mit der Sie eine GUI (nach Wahl) verwenden können, um den Verlauf der Datei anzuzeigen. Die anderen Antworten haben auch nicht erklärt, wie man sich auf die letzten X-Revisionen beschränkt (überhaupt möglich?), Was in Git einfach ist. git log X..Y -o filename
TamaMcGlinn
21

Beginnen mit

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

Dadurch erhalten Sie eine Liste der Revisionen, in denen sich die Datei geändert hat, mit denen Sie wiederholte Aufrufe per Skript ausführen können svn diff.


quelle
4
oder ... mach weiter! svn log -q some_file.xxx | grep ^r | awk '{print $1}' | sed -e 's/^r//' | xargs -i svn diff -rHEAD:{} some_file.xxx > ~/file_history.txtnetter kleiner
Einzeiler
8

Der seltsam benannte Befehl "Schuld" tut dies. Wenn Sie Tortoise verwenden, wird ein Dialogfeld "Von Revision" angezeigt. Anschließend wird eine Datei mit einer zeilenweisen Anzeige der Revisionsnummer und des Autors angezeigt.

Wenn Sie mit der rechten Maustaste auf die Revisionsinformationen klicken, können Sie ein Dialogfeld "Protokoll anzeigen" aufrufen, in dem alle Informationen zum Einchecken sowie andere Dateien, die Teil des Eincheckens waren, angezeigt werden.

goosemanjack
quelle
1
Das ist sehr nützlich, aber nicht das, wonach das OP gesucht hat. Dies ist ein vollständiger Verlauf der Datei, nicht nur die historischen Beiträge der aktuellen Datei. Dieser vollständige Verlauf ist nützlich, wenn Sie zurückblicken, um herauszufinden, warum und wann bestimmter Code entfernt oder geändert wurde.
Adam Tolley
Im Gegenteil, der Name ist ganz richtig. Hier erfahren Sie, wen Sie für einen bestimmten (beschissenen / fehlerhaften / unverständlichen) Codeabschnitt verantwortlich machen müssen.
ivan_pozdeev
Wäre es nicht gut, wenn der offensichtliche Name für den Befehl eher "Kredit" als "Schuld" wäre? :)
Nick
1
@ Nick svn Lob ist ein Alias ​​für svn Schuld, je nachdem, wie man sich fühlt.
Stefgosselin
@stefgosselin - Danke für diesen Hinweis. Ich bin froh zu wissen, dass es eine Wahl gibt! :)
Nick
3

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

D-Rock
quelle
3

Danke, Bendin. Ihre Lösung gefällt mir sehr gut.

Ich habe es so geändert, dass es in umgekehrter Reihenfolge funktioniert, wobei zuerst die letzten Änderungen angezeigt wurden. Was bei langjährigem Code wichtig ist, der über mehrere Jahre gepflegt wird. Normalerweise pfeife ich es in mehr.

svnhistory elements.py |more

Ich habe der Sortierung -r hinzugefügt. Ich habe spec entfernt. Behandlung für 'erste Aufzeichnung'. Es ist ein Fehler beim letzten Eintrag, da es nichts gibt, womit es sich unterscheiden könnte. Obwohl ich damit lebe, 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 $url@HEAD
            svn diff -c$r $url@HEAD
            echo
    done
    }
}

history_of_file $1
dlink
quelle
0

Ich habe bei der Recherche zu diesem Thema eine Reihe von Teilantworten gesehen. Das hat bei mir funktioniert und ich hoffe, es hilft anderen. Dieser Befehl zeigt die Ausgabe in der Befehlszeile mit der Revisionsnummer, dem Autor, dem Revisionszeitstempel und den vorgenommenen Änderungen an:

svn blame -v <filename>

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

Alamba
quelle