web-dev-qa-db-fra.com

Comment afficher toutes les modifications historiques d'un fichier dans SVN

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

158
Gordon Wilson

Il n'y a pas de commande intégrée pour cela, donc je fais habituellement juste quelque chose comme ça

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

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écédée de l'heure et de l'auteur du commit qui l'a modifié en dernier.

138
ngn

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

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

Vous pouvez utiliser git-svn pour importer le référentiel dans un référentiel Git, puis utiliser git log -p filename. Ceci affiche chaque entrée du journal du fichier suivi du diff correspondant.

37
Greg Hewgill

Commencer avec

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

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

18
Jack

La commande "blame", bizarrement nommée, fait cela. Si vous utilisez Tortoise, une boîte de dialogue "depuis la révision" s'affiche, 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 fournit des informations d’archivage complètes, ainsi que d’autres fichiers faisant partie de l’archivage.

8
goosemanjack

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 afin de générer toutes les différences. Une approche plus simple consisterait à utiliser un client svn à interface graphique, le cas échéant. Beaucoup d'entre eux, tels que le plugin subversif pour Eclipse, listeront l'historique d'un fichier et vous permettront de voir le diff de chaque révision.

3
D-Rock

Merci Bendin. J'aime beaucoup votre solution.

Je l'ai modifié pour fonctionner dans l'ordre inverse, en affichant d'abord les modifications les plus récentes. Ce qui est important avec un code de longue date, maintenu sur plusieurs années. Je l'utilise généralement en plus.

svnhistory elements.py |more

J'ai ajouté -r à la sorte. J'ai enlevé spec. traitement pour 'premier enregistrement'. C’est parce que la dernière entrée est erronée, car il n’ya rien qui la différencie. Bien que je vis avec cela 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
3
dlink

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 le résultat 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 pour ce que vous cherchez.

0
alamba