178 votes

Comment puis-je visualiser l'historique des modifications apportées à un fichier dans le SVN ?

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

16 votes

Il est caché dans la commande étrangement nommée "blame".

6 votes

Je pensais que @goosemanjack plaisantait, jusqu'à ce que je l'essaie.

185voto

bendin Points 6651

Il n'y a pas de commande intégrée pour cela, donc je fais généralement 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

35 votes

Je n'ai jamais vu cette astuce de "tuyauterie dans le bloc renforcé" avant. Super.

6 votes

Version du fichier de lot de ce script, fwiw.

0 votes

J'ai ajouté ceci à mon fichier .bashrc. Lorsque je démarre, j'obtiens svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'

149voto

ngn Points 2820

Légèrement différent de ce que vous avez décrit, mais je pense que c'est 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.

4 votes

Whoa, c'est génial ! J'utilise SVN depuis des années et je ne le savais pas :O

5 votes

Vous pouvez avoir besoin de l'option verbose/-v pour voir l'horodatage (c'est le cas avec ma version par défaut de svn 1.7.9).

0 votes

Mon professeur a écrit le plugin de blâme initial à svn. J'ai quand même dû vérifier. Il est totalement en train de faire un auto-remplissage dans ce devoir :P

98voto

redfog Points 335

Si vous voulez voir l'historique complet d'un fichier avec les changements de code :

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

3 votes

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 bash script.

1 votes

Je pense que svn 1.7.4 a introduit l'option --diff puisqu'il dispose de tests pour l'option alors que la version 1.7.3 n'en a aucun - subversion/tests/cmdline/log_tests.py .

0 votes

Une petite note : selon 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).

38voto

Greg Hewgill Points 356191

Vous pourriez utiliser git-svn pour importer le référentiel dans un référentiel Git, puis utilisez git log -p filename . Cela montre chaque entrée de journal pour le fichier suivi par le diff correspondant.

27 votes

Installer git, créer un dépôt git, utiliser une commande git ? La question a été étiquetée et posée sur Subversion.

21 votes

J'utilise git comme client Subversion avec git-svn. Voici comment je ferais l'opération log+diff contre un dépôt Subversion. Git possède d'excellents outils pour la visualisation des dépôts, ce n'est pas une idée si farfelue.

10 votes

Ci-dessus quelqu'un est (à juste titre) félicité pour avoir écrit un joli script - pour fournir une fonctionnalité non présente dans SVN. Vu que git est local sauf si on pousse, on pourrait appeler ça de l'outillage, pas besoin de s'énerver sur les choses.

21voto

Commencez par

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

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

4 votes

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.txt joli petit texte (awk fait la même chose que cut)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X