Come posso visualizzare tutte le modifiche storiche a un file in SVN


169

So che posso svn diff -r a:b repo visualizzare le modifiche tra le due revisioni specificate. Quello che vorrei è un diff per ogni revisione che ha cambiato il file. Tale comando è disponibile?


16
È nascosto nel comando stranamente chiamato "biasimo".
goosemanjack,

6
Pensavo che @goosemanjack stesse scherzando, fino a quando non l'ho provato.
SSH Questo

Risposte:


181

Non esiste un comando integrato per questo, quindi di solito faccio solo una cosa del genere:

#!/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
    }
}

Quindi, puoi chiamarlo con:

history_of_file $1

35
Non ho mai visto quel trucco "convogliare nel blocco controvento" prima d'ora. Neat.

5
Versione del file batch di questo script, prima della fine.
Ladenedge,

Ho aggiunto questo al mio file .bashrc. Quando avvio ricevo svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
Francisc0 il

1
@ Francisco0: non includere la riga finale nel tuo bashrc. non fa parte della definizione della funzione, è una chiamata alla funzione perché l'esempio fornito è inteso per l'uso come script autonomo.
Bendin,

26
svn log --diff [path_to_file]funziona esattamente così! stackoverflow.com/a/24938573/3185510
Webster

143

Leggermente diverso da quello che hai descritto, ma penso che questo potrebbe essere ciò di cui hai effettivamente bisogno:

svn blame filename

Stampa il file con ogni riga preceduta dal tempo e dall'autore del commit che lo ha modificato per ultimo.


4
Whoa questo è fantastico! Uso SVN da anni e non l'ho mai saputo: O
Sì, Barry,

4
Potresti aver bisogno dell'opzione verbose / -v per vedere il timestamp (lo faccio con la mia build predefinita di svn 1.7.9).
Weston C

il mio professore ha scritto il plugin di colpa iniziale su svn. Ho dovuto cercare ancora. Sta facendo un auto-riempimento in questo compito. : P
Joseph Dailey,

93

Se vuoi vedere l'intera cronologia di un file con modifiche al codice:

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

3
Non so quando è stata aggiunta l'opzione --diff ma funziona con svn 1.8.10, quindi non c'è bisogno di uno script bash
Guillaume Gros

1
Penso che svn 1.7.4 abbia introdotto l'opzione --diffpoiché ha dei test per l'opzione mentre 1.7.3 non ne ha - subversion/tests/cmdline/log_tests.py.
valido il

Solo una piccola nota: a seconda della lunghezza della cronologia, ciò può richiedere del tempo prima che il file log.txt sia completamente renderizzato (anche se sarà immediatamente leggibile).
Ivan Durst,

1
Come si limita questo alle più recenti revisioni X?
Enigma

@Enigma: con l' --limit <number>opzione. In questo modo:svn log --diff --limit 5 [path_to_file]
Reid

37

È possibile utilizzare git-svnper importare il repository in un repository Git, quindi utilizzare git log -p filename. Questo mostra ogni voce del registro per il file seguita dal corrispondente diff.


27
Installa git, crea un repository git, usa un comando git? La domanda è stata taggata e posta su Subversion.
Ken Gentle,

21
Uso git come client Subversion con git-svn. Ecco come farei l'operazione log + diff su un repository Subversion. Git ha alcuni strumenti davvero eccellenti per la visualizzazione dei repository, non è un'idea così stravagante.
Greg Hewgill,

10
Sopra qualcuno viene (giustamente) congratulato per aver scritto una bella sceneggiatura - per fornire funzionalità non presenti in SVN. Vedendo che git è locale a meno che non si spinga, è possibile chiamare questo strumento, non c'è bisogno di arrabbiarsi per nulla.
Adam Tolley,

È anche l'unica risposta che ti consente di utilizzare una GUI (di scelta) per visualizzare la cronologia del file. Le altre risposte non hanno anche spiegato come limitare alle ultime X revisioni (possibile affatto?), Il che è semplice. git log X..Y -o filename
TamaMcGlinn,

21

Iniziare con

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

Verrà visualizzato un elenco di revisioni in cui è stato modificato il file, che è quindi possibile utilizzare per eseguire lo script delle chiamate ripetute svn diff.


4
o ... continua! 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.txtbel piccolo one-liner (awk fa lo stesso del taglio)
Kasapo

8

Il comando "biasimo" stranamente chiamato fa questo. Se usi Tortoise, ti dà una finestra di dialogo "dalla revisione", quindi un elenco di file con un indicatore riga per riga del numero di revisione e autore accanto ad esso.

Se fai clic con il pulsante destro del mouse sulle informazioni di revisione, puoi visualizzare una finestra di dialogo "Mostra registro" che fornisce informazioni complete sul check-in, insieme ad altri file che facevano parte del check-in.


1
Questo è molto utile, ma non quello che l'OP stava cercando, che è una cronologia completa del file, non solo i contributi storici del file corrente. Tale cronologia completa è utile quando si guarda indietro per capire perché un determinato codice è stato rimosso o modificato e quando.
Adam Tolley,

Al contrario, il nome è abbastanza giusto. Ti dice a chi dare la colpa per un particolare pezzo di codice (scadente / difettoso / incomprensibile).
ivan_pozdeev,

Non sarebbe bello se il nome ovvio per il comando fosse "credito" piuttosto che "colpa"? :)
Nick,

1
La lode di @Nick svn è un alias per dare la colpa a svn, a seconda di come ci si sente.
stefgosselin,

@stefgosselin - Grazie per la nota. Sono felice di sapere che c'è una scelta! :)
Nick,

3

Per quanto ne so, non esiste un comando svn incorporato per ottenere questo risultato. Dovresti scrivere uno script per eseguire diversi comandi per creare tutte le differenze. Un approccio più semplice sarebbe quello di utilizzare un client svn GUI se questa è un'opzione. Molti di essi come il plug-in sovversivo per Eclipse elencheranno la cronologia di un file e ti permetteranno di visualizzare il diff di ogni revisione.


3

Grazie Bendin. Mi piace molto la tua soluzione.

L'ho modificato per funzionare in ordine inverso, mostrando prima le modifiche più recenti. Il che è importante con un codice di vecchia data, mantenuto per diversi anni. Di solito lo installo di più.

svnhistory elements.py |more

Ho aggiunto -r all'ordinamento. Ho rimosso le specifiche. gestione per "primo record". È errore sull'ultima voce, poiché non c'è nulla con cui diffonderlo. Anche se ci sto vivendo perché non scendo mai così lontano.

#!/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

0

Ho visto un sacco di risposte parziali durante la ricerca di questo argomento. Questo è ciò che ha funzionato per me e spero che aiuti gli altri. Questo comando visualizzerà l'output sulla riga di comando, mostrando il numero di revisione, l'autore, il timestamp di revisione e le modifiche apportate:

svn blame -v <filename>

Per semplificare la tua ricerca, puoi scrivere l'output in un file e grep per quello che stai cercando.

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.