2008-11-12 4 views
146

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

+16

Es ist in der seltsamen Namen versteckt ist „schuld“ -Befehl. – goosemanjack

+6

Ich dachte, @goosemanjack machte Witze, bis ich es versuchte. –

Antwort

166

Es gibt keinen eingebauten dafür Befehl, so dass ich in der Regel nur so etwas tun:

#!/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 Sie es mit anrufen:

history_of_file $1 
+32

Ich habe noch nie zuvor gesehen, dass ich "in den verspannten Block" trickse. Ordentlich. –

+5

[Batch-Dateiversion] (http://stackoverflow.com/questions/5622367/generate-history-of-changes-on-a-file-in-svn/5721533#5721533) dieses Skripts, fwiw. – ladenedge

+0

Ich habe dies meiner .bashrc-Datei hinzugefügt. Wenn ich anfange, bekomme ich 'svn: '. ist keine Arbeitskopie svn: Syntaxfehler in Revisionsargument '@HEAD' svn: Syntaxfehler in Revisionsargument '@ HEAD'' – Francisc0

36

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 von dem entsprechenden Diff.

+22

Installieren Sie Git, erstellen Sie ein Git-Repository, verwenden Sie einen Git-Befehl? Die Frage wurde markiert und nach Subversion gefragt. –

+17

Ich benutze git als Subversion-Client mit git-svn. So würde ich die log + diff-Operation gegen ein Subversion-Repository durchführen. Git hat einige wirklich gute Tools für das Anzeigen von Repositories, es ist keine so ausgefallene Idee. –

+6

Über jemand ist (zu Recht) gratuliert, ein nettes Skript zu schreiben - um Funktionalität zur Verfügung zu stellen, die nicht in SVN vorhanden ist. Sehen Sie, dass git lokal ist, wenn Sie nicht drücken, könnten Sie diese Werkzeuge nennen, keine Notwendigkeit, sich über Dinge zu ärgern. –

3

Soweit ich weiß, gibt es keinen eingebauten Svn-Befehl, um dies zu erreichen. Sie müssten ein Skript schreiben, um mehrere Befehle auszuführen, um alle Diffs zu erstellen. 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 erlauben es Ihnen, den Unterschied jeder Revision zu sehen.

17

beginnen mit

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

, dass Sie eine Liste der Revisionen erhalten, wo die Datei geändert, die Sie dann auf Skript wiederholte Anrufe svn diff verwenden können.

+4

oder ... mach weiter! '' svn log -q einige_datei.xxx | grep^r | awk '{print $ 1}' | sed -e's/^ r // '| xargs -i svn diff -rHEAD: {} some_file.xxx> ~/file_history.txt'' netter kleiner Einzeiler (awk tut das selbe wie geschnitten) – Kasapo

128

etwas anders aus, was Sie beschrieben , aber ich denke, das könnte sein, was Sie tatsächlich brauchen:

svn blame filename 

Es wird die Datei mit jeder Zeile vor drucken festgelegt durch die Zeit und Autor des Commits, das es zuletzt geändert hat.

+4

Whoa das ist genial! Benutze seit Jahren SVN und wusste nie darüber: O –

+2

Du brauchst vielleicht die ausführliche/-v Option, um den Zeitstempel zu sehen (ich mache das mit meinem Standard Build von svn 1.7.9). –

+0

mein Professor schrieb das erste Schuld Plugin zu Svn. Ich musste das immer noch nachsehen. Er erledigt diese Aufgabe völlig selbst. : P –

8

Der seltsam benannte "Schuld" Befehl tut dies. Wenn Sie Tortoise verwenden, erhalten Sie einen Dialog "Von Revision", dann eine Dateiliste mit einem zeilenweisen Indikator für die Versionsnummer und den Autor daneben.

Wenn Sie mit der rechten Maustaste auf die Revisionsinformationen klicken, können Sie einen "Protokoll anzeigen" -Dialog aufrufen, der zusammen mit anderen Dateien, die zum Check-in gehörten, vollständige Checkin-Informationen enthält.

+1

Das ist sehr nützlich, aber nicht das, was das OP gesucht hat, das ist eine vollständige Geschichte der Datei, nicht nur die historischen Beiträge der aktuellen Datei. Diese vollständige Historie ist nützlich, wenn Sie zurückschauen, um herauszufinden, warum bestimmter Code entfernt oder geändert wurde und wann. –

+0

Im Gegenteil, der Name ist völlig richtig. Es sagt Ihnen, wen Sie für einen bestimmten (crappy/buggy/nicht verständlichen) Codeabschnitt verantwortlich machen können. –

+0

Wäre es nicht gut, wenn der offensichtliche Name für den Befehl "Kredit" statt "Schuld" wäre? :) – Nick

3

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

Ich habe es geändert, um in umgekehrter Reihenfolge zu arbeiten, mit den neuesten Änderungen zuerst. Was ist wichtig mit langjähriger Code, über mehrere Jahre aufrechterhalten. Normalerweise schicke ich es in mehr hinein.

svnhistory elements.py |more 

Ich habe -r zu der Sorte hinzugefügt. Ich habe die Spezifikation entfernt. Handhabung für 'erste Aufnahme'. Es ist ein Fehler beim letzten Eintrag, da es nichts zu unterscheiden gibt. Obwohl ich damit lebe, weil ich nie so weit 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 
74

Wenn Sie ganze Geschichte einer Datei mit Code-Änderungen sehen möchten:

svn log --diff [path_to_file] > log.txt 
+2

Ich weiß nicht, wann die Option --diff hinzugefügt wurde, aber es funktioniert mit Svn 1.8.10, so dass kein Bash-Skript –

+1

Ich denke, Svn 1.7.4 führte die Option '--diff' seit es hat Tests für die Option, während 1.7.3 keine hat - "subversion/tests/cmdline/log_tests.py". – valid

+0

Nur eine kleine Anmerkung: Abhängig von der Länge des Verlaufs kann dies einige Zeit dauern, bevor die Datei log.txt vollständig gerendert wird (obwohl sie sofort lesbar ist). –

Verwandte Themen