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?
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
}
}
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.
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.
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.
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.
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.
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
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.
Réponses:
Il n'y a pas de commande intégrée pour cela, donc je fais généralement quelque chose comme ceci:
Ensuite, vous pouvez l'appeler avec:
la source
svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
svn log --diff [path_to_file]
fonctionne exactement comme ça! stackoverflow.com/a/24938573/3185510Lé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:
Il imprimera le fichier avec chaque ligne préfixée par l'heure et l'auteur du commit qui l'a modifié en dernier.
la source
Si vous souhaitez voir l'historique complet d'un fichier avec des modifications de code:
la source
--diff
car il a des tests pour l'option alors que 1.7.3 n'en a aucun -subversion/tests/cmdline/log_tests.py
.--limit <number>
option. Comme ça:svn log --diff --limit 5 [path_to_file]
Vous pouvez utiliser
git-svn
pour importer le référentiel dans un référentiel Git, puis utilisergit log -p filename
. Cela montre chaque entrée de journal pour le fichier suivie du diff correspondant.la source
git log X..Y -o filename
Commencer avec
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
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 one-liner (awk fait la même chose que cut)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.
la source
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.
la source
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.
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.
la source
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:
Pour faciliter votre recherche, vous pouvez écrire la sortie dans un fichier et grep ce que vous recherchez.
la source