Comment afficher toutes les modifications historiques apportées à un fichier dans SVN

169

Je sais que je peux svn diff -r a:b repo voir les changements entre les deux révisions spécifiées. Ce que je voudrais, c'est un diff pour chaque révision qui a changé le fichier. Une telle commande est-elle disponible?

Gordon Wilson
la source
16
Il est caché dans la commande "blame" étrangement nommée.
goosemanjack
6
Je pensais que @goosemanjack plaisantait, jusqu'à ce que je l'essaye.
SSH ce

Réponses:

181

Il n'y a pas de commande intégrée pour cela, donc je fais généralement quelque chose comme ceci:

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

Ensuite, vous pouvez l'appeler avec:

history_of_file $1
bendin
la source
35
Je n'ai jamais vu cette astuce de "piping into the braced block" auparavant. Soigné.
5
Version de fichier batch de ce script, fwiw.
chargé le
J'ai ajouté ceci à mon fichier .bashrc. Quand je démarre, je reçois svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
Francisc0
1
@ Francisco0: n'incluez pas la dernière ligne dans votre bashrc. cela ne fait pas partie de la définition de la fonction, c'est un appel à la fonction car l'exemple donné est destiné à être utilisé en tant que script autonome.
bendin
26
svn log --diff [path_to_file]fonctionne exactement comme ça! stackoverflow.com/a/24938573/3185510
webster
143

Légèrement différent de ce que vous avez décrit, mais je pense que c'est peut-être ce dont vous avez réellement besoin:

svn blame filename

Il imprimera le fichier avec chaque ligne préfixée par l'heure et l'auteur du commit qui l'a modifié en dernier.

ngn
la source
4
Whoa c'est génial! J'utilise SVN depuis des années et je n'ai jamais su à ce sujet: O
Oui Barry
4
Vous aurez peut-être besoin de l'option verbose / -v pour voir l'horodatage (je le fais avec ma version par défaut de svn 1.7.9).
Weston C
mon professeur a écrit le plugin de blâme initial à svn. Je devais encore chercher ça. Il fait totalement un auto-remplissage dans cette mission. : P
Joseph Dailey
93

Si vous souhaitez voir l'historique complet d'un fichier avec des modifications de code:

svn log --diff [path_to_file] > log.txt
Emilie Zawadzki
la source
3
Je ne sais pas quand l'option --diff a été ajoutée mais elle fonctionne avec svn 1.8.10, donc pas besoin d'un script bash
Guillaume Gros
1
Je pense que svn 1.7.4 a introduit l'option --diffcar il a des tests pour l'option alors que 1.7.3 n'en a aucun - subversion/tests/cmdline/log_tests.py.
valable
Juste une petite note: en fonction de la longueur de l'historique, cela peut prendre un certain temps avant que le fichier log.txt ne soit complètement rendu (bien qu'il soit lisible immédiatement).
Ivan Durst le
1
Comment limiter cela aux dernières révisions X?
Enigma
@Enigma: avec l' --limit <number>option. Comme ça:svn log --diff --limit 5 [path_to_file]
Reid le
37

Vous pouvez utiliser git-svnpour importer le référentiel dans un référentiel Git, puis utiliser git log -p filename. Cela montre chaque entrée de journal pour le fichier suivie du diff correspondant.

Greg Hewgill
la source
27
Installez git, créez un référentiel git, utilisez une commande git? La question a été étiquetée et posée sur Subversion.
Ken Gentle
21
J'utilise git comme client Subversion avec git-svn. C'est ainsi que je ferais l'opération log + diff sur un référentiel Subversion. Git a d'excellents outils pour la visualisation des référentiels, ce n'est pas une idée si farfelue.
Greg Hewgill
10
Ci-dessus, quelqu'un est (à juste titre) félicité pour avoir écrit un joli script - pour fournir des fonctionnalités non présentes dans SVN. Voyant que git est local sauf si vous poussez, vous pouvez appeler cet outil, pas besoin de vous fâcher.
Adam Tolley
C'est également la seule réponse qui vous permet d'utiliser une interface graphique (de votre choix) pour afficher l'historique du fichier. Les autres réponses n'ont pas non plus expliqué comment se limiter aux X dernières révisions (possible du tout?), Ce qui est facile dans git. git log X..Y -o filename
TamaMcGlinn
21

Commencer avec

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

Cela vous donnera une liste des révisions où le fichier a changé, que vous pouvez ensuite utiliser pour scripter des appels répétés svn diff.


la source
4
ou ... continuez! 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.txtjoli petit one-liner (awk fait la même chose que cut)
Kasapo
8

La commande "blame" étrangement nommée le fait. Si vous utilisez Tortoise, il vous donne une boîte de dialogue "à partir de la révision", puis une liste de fichiers avec un indicateur ligne par ligne du numéro de révision et de l'auteur à côté.

Si vous cliquez avec le bouton droit sur les informations de révision, vous pouvez afficher une boîte de dialogue "Afficher le journal" qui donne des informations complètes sur l'archivage, ainsi que d'autres fichiers qui faisaient partie de l'archivage.

goosemanjack
la source
1
C'est très utile, mais pas ce que l'OP recherchait, qui est un historique complet du fichier, pas seulement les contributions historiques du fichier actuel. Cet historique complet est utile lorsque vous regardez en arrière pour comprendre pourquoi certains codes ont été supprimés ou modifiés, et quand.
Adam Tolley
Au contraire, le nom est tout à fait exact. Il vous dit qui blâmer pour un morceau de code particulier (merdique / bogué / incompréhensible).
ivan_pozdeev
Ne serait-il pas bon que le nom évident de la commande soit «crédit» plutôt que «blâme»? :)
Nick
1
@Nick svn louange est un alias à blâmer svn, selon ce que l'on ressent.
stefgosselin
@stefgosselin - Merci pour cette note. Je suis content de savoir qu'il y a un choix! :)
Nick
3

Autant que je sache, il n'y a pas de commande svn intégrée pour accomplir cela. Vous auriez besoin d'écrire un script pour exécuter plusieurs commandes pour construire tous les diffs. Une approche plus simple serait d'utiliser un client svn GUI si c'est une option. Beaucoup d'entre eux comme le plugin subversif pour Eclipse listeront l'historique d'un fichier et vous permettront de visualiser le diff de chaque révision.

D-Rock
la source
3

Merci, Bendin. J'aime beaucoup votre solution.

Je l'ai changé pour qu'il fonctionne dans l'ordre inverse, en montrant les changements les plus récents en premier. Ce qui est important avec un code de longue date, maintenu sur plusieurs années. Je le transforme généralement en plus.

svnhistory elements.py |more

J'ai ajouté -r au tri. J'ai supprimé les spécifications. traitement pour «premier enregistrement». C'est une erreur sur la dernière entrée, car il n'y a rien pour le comparer. Même si je vis avec parce que je ne descends jamais aussi loin.

#!/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
la source
0

J'ai vu un tas de réponses partielles lors de mes recherches sur ce sujet. C'est ce qui a fonctionné pour moi et j'espère que cela aidera les autres. Cette commande affichera la sortie sur la ligne de commande, indiquant le numéro de révision, l'auteur, l'horodatage de la révision et les modifications apportées:

svn blame -v <filename>

Pour faciliter votre recherche, vous pouvez écrire la sortie dans un fichier et grep ce que vous recherchez.

alamba
la source