Recherche dans l'historique de subversion (texte intégral)

135

Existe-t-il un moyen d'effectuer une recherche en texte intégral dans un référentiel de subversion, y compris toute l'historique?

Par exemple, j'ai écrit une fonctionnalité que j'ai utilisée quelque part, mais qui n'était pas nécessaire, alors j'ai svn rm'd les fichiers, mais maintenant je dois la retrouver pour l'utiliser pour autre chose. Le journal svn dit probablement quelque chose comme "supprimé les éléments inutilisés", et il y a des tas de vérifications comme ça.

Edit 2016-04-15: Veuillez noter que ce qui est demandé ici par le terme "recherche en texte intégral", c'est de rechercher les différences réelles de l'historique des commit, et non les noms de fichiers et / ou les messages de commit . Je le souligne parce que la formulation de l'auteur ci-dessus ne reflète pas très bien cela - puisque dans son exemple, il pourrait aussi bien ne chercher qu'un nom de fichier et / ou un message de validation. D'où beaucoup de svn logréponses et de commentaires.

rjmunro
la source
6
Apache Subversion 1.8 accepte l' --searchargument de la svn logcommande. Voir ma réponse sur stackoverflow.com/a/17473516/761095
bahrep
3
svn log --searchn'effectue pas de recherche en texte intégral comme l'exige @rjmunro, mais recherche uniquement l'auteur, la date, le message du journal et la liste des chemins modifiés.
zb226

Réponses:

77
git svn clone <svn url>
git log -G<some regex>
luis gutierrez
la source
1
Bon point. L'interface graphique de gitk effectue très bien ce type de recherche, et il est facile d'utiliser les outils git svn pour accéder à un dépôt svn. Certes, je suis passé entièrement à l'utilisation de git depuis le moment où j'ai posé cette question, donc accepter cette réponse pourrait être un peu spécifique pour moi.
rjmunro le
4
Attention, cela peut prendre un certain temps en fonction de la taille de votre référentiel. Pour moi, cela a pris plus d'une heure.
user247702
20
J'ai critiqué cette solution car la conversion d'un grand référentiel SVN en GIT n'est souvent pas faisable ou prendrait beaucoup trop de temps. C'est comme recommander Java lorsque vous avez une question sur une construction de langage C #.
ooxi
3
Vous devrez peut-être installer un package supplémentaire pour cette commande. Sur Ubuntu, vous le souhaitez apt-get install git-svn.
nedned
5
"Svn log --verbose --diff | grep ..." n'achète-t-il pas à peu près la même fonctionnalité sans avoir à utiliser git?
lyte le
41

svn logdans Apache Subversion 1.8 prend en charge une nouvelle --searchoption . Vous pouvez donc rechercher les messages du journal de l'historique du référentiel Subversion sans utiliser les outils et scripts tiers.

svn log --search recherche dans l'auteur, la date, le texte du message du journal et la liste des chemins modifiés.

Voir SVNBook | svn logréférence de ligne de commande .

bahrep
la source
7
Recherche pratique, mais pas en texte intégral. Je m'en tiens à la réponse git-svn :-)
rjmunro
4
Non pas que pour le moment, svn repos sur googlecode fonctionne toujours sur svn 1.6 ... voir: code.google.com/p/support/wiki/… ? Mais, la mise à jour de votre client à 1,8 (et la mise à niveau svn de tout dépôt extrait) vous permettra d'utiliser svn log --search sur le dépôt ...
Mario Ruggier
La copie de travail a besoin de toutes les mises à jour, mais cette commande répertorie l'ensemble du changement, y compris le numéro de révision, les fichiers modifiés et les commentaires. Comment n'est-ce pas du texte intégral?
Bernhard Döbler
24

Si vous utilisez Windows, jetez un œil à SvnQuery . Il gère un index de texte intégral des référentiels locaux ou distants. Chaque document jamais engagé dans un référentiel est indexé. Vous pouvez effectuer des requêtes de type Google à partir d'une interface Web simple.

Christian Rodemeyer
la source
Ce serait génial si SvnQuery était toujours maintenu, mais malheureusement, il est mort et maintenant cela ne fonctionne tout simplement plus.
Dan Atkinson
J'ai trouvé un clone fonctionnel (?) Sur github.com/kalyptorisk/svnquery/releases
Philip Helger
21

J'utilise un petit shellscript, mais cela ne fonctionne que pour un seul fichier. Vous pouvez bien sûr combiner cela avec find pour inclure plus de fichiers.

#!/bin/bash
for REV in `svn log $1 | grep ^r[0-9] | awk '{print $1}'`; do 
  svn cat $1 -r $REV | grep -q $2
  if [ $? -eq 0 ]; then 
    echo "$REV"
  fi 
done

Si vous voulez vraiment tout rechercher, utilisez la svnadmin dumpcommande et grep.

Bas Grolleman
la source
J'ai dû supprimer le "r" des numéros de révision avec: awk '{print substr ($ 1,2, length ($ 1))}' et supprimer l'option grep "-q", pour afficher les correspondances.
Hugo
strings myDump.txt | grep "turtle fwd 10"
jedierikb
2
Et c'est pourquoi nous adoptons git.
Expiation limitée
peut vouloir faire le dernier grep -i pour ignorer la casse et supprimer le -q pour voir réellement la ligne qui correspond
Belun
13

Le meilleur moyen que j'ai trouvé pour le faire est avec moins:

svn log --verbose | Moins

Une fois que moins arrive avec la sortie, vous pouvez frapper /pour rechercher, comme VIM.

Éditer:

Selon l'auteur, il souhaite rechercher plus que les messages et les noms de fichiers. Dans ce cas, vous devrez le ghetto-hacker avec quelque chose comme:

svn diff -r0:HEAD | less

Vous pouvez également remplacer grepou autre chose pour faire la recherche pour vous. Si vous souhaitez l'utiliser sur un sous-répertoire du référentiel, vous devrez utiliser svn logpour discerner la première révision dans laquelle ce répertoire existait, et utiliser cette révision à la place de 0.

Jack M.
la source
5
Ce n'est pas une recherche de texte intégral, c'est une recherche dans les journaux et les noms de fichiers.
rjmunro
Si tel est le cas, vous devez utiliser des journaux de validation plus expressifs. Si vous voulez grep la différence entre les révisions, c'est une toute autre boule de cire. Et je ne connais personnellement pas un moyen de le faire.
Jack M.
> svn diff -r0: HEAD> log> less log est mon choix sur Windows. Merci
kingoleg
9

Je cherchais quelque chose de similaire. Le meilleur que j'ai trouvé est OpenGrok . Je n'ai pas encore essayé de le mettre en œuvre, mais cela semble prometteur.

Mike Schall
la source
J'utilise OpenGrok depuis plusieurs mois, ça déchire.
Mauricio Scheffer le
7
svn log -v [repository] > somefile.log

pour diff, vous pouvez utiliser l' --diffoption

svn log -v --diff [repository] > somefile.log

puis utilisez vim ou nano ou ce que vous aimez utiliser, et faites une recherche pour ce que vous recherchez. Vous le trouverez assez rapidement.

Ce n'est pas un script sophistiqué ou quoi que ce soit d'automatisé. Mais ça marche.

JREN
la source
AFAICS, qui recherchera les messages de validation, pas les différences réelles.
rjmunro
Ensuite, utilisez svn log -v --diff [repository]> somefile.log
JREN
6

Bien que ce ne soit pas gratuit, vous pouvez jeter un œil à Fisheye d'Atlassian, les mêmes personnes qui vous apportent JIRA. Il effectue une recherche en texte intégral contre SVN avec de nombreuses autres fonctionnalités utiles.

http://www.atlassian.com/software/fisheye/

mrjabba
la source
1
Fisheye est plutôt bon. Comme vous le dites, pas gratuit, mais la licence de committer <= 10 ne coûte que 10 $ / an.
Jason S
Actuellement, 5 utilisateurs coûtent 10 $, MAIS à seulement 10 utilisateurs, cela passe à 1000 $!
Mawg dit de réintégrer Monica le
4

Je viens de rencontrer ce problème et

svnadmin dump <repo location> |grep -i <search term>

fait le travail pour moi. J'ai renvoyé la révision de la première occurrence et j'ai cité la ligne que je cherchais.

Pfyon
la source
1
Fonctionne uniquement localement et prendra beaucoup de temps si un référentiel est volumineux.
bahrep
2

Je n'ai aucune expérience avec cela, mais SupoSE (open source, écrit en Java) est un outil conçu pour faire exactement cela.

dF.
la source
2

svn log -l<commit limit> | grep -C<5 or more lines> <search message>

zednight
la source
1

Je fais généralement ce que dit Jack M (utilisez svn log --verbose) mais je dirige vers grep au lieu de less.

Mark Biek
la source
5
Ce n'est pas une recherche de texte intégral, c'est une recherche dans les journaux et les noms de fichiers.
rjmunro
C'est ce que je finis généralement par faire, mais j'ai trouvé qu'avec lessvous pouvez voir la révision, la date, etc. au lieu de simplement la ligne dans le commentaire. C'est généralement ce que je recherche de toute façon.
Jack M.
1

J'ai écrit ceci comme un script cygwin bash pour résoudre ce problème.

Cependant, il faut que le terme de recherche se trouve actuellement dans le fichier du système de fichiers. Pour tous les fichiers qui correspondent au système de fichiers grep, un grep de tous les diffs svn pour ce fichier est alors effectué. Pas parfait, mais devrait être assez bon pour la plupart des utilisations. J'espère que cela t'aides.

/ usr / local / bin / svngrep

#!/bin/bash
# Usage: svngrep $regex @grep_args

regex="$@"
pattern=`echo $regex | perl -p -e 's/--?\S+//g; s/^\\s+//;'` # strip --args
if [[ ! $regex ]]; then
    echo "Usage: svngrep \$regex @grep_args"
else 
    for file in `grep -irl --no-messages --exclude=\*.tmp --exclude=\.svn $regex ./`;     do 
        revs="`svnrevisions $file`";
        for rev in $revs; do
            diff=`svn diff $file -r$[rev-1]:$rev \
                 --diff-cmd /usr/bin/diff -x "-Ew -U5 --strip-trailing-cr" 2> /dev/null`
            context=`echo "$diff" \
                 | grep -i --color=none   -U5 "^\(+\|-\).*$pattern" \
                 | grep -i --color=always -U5             $pattern  \
                 | grep -v '^+++\|^---\|^===\|^Index: ' \
                 `
            if [[ $context ]]; then
                info=`echo "$diff" | grep '^+++\|^---'`
                log=`svn log $file -r$rev`
                #author=`svn info -r$rev | awk '/Last Changed Author:/ { print $4 }'`; 

                echo "========================================================================"
                echo "========================================================================"
                echo "$log"
                echo "$info"
                echo "$context"
                echo
            fi;
        done;
    done;
fi

/ usr / local / bin / svnrevisions

#!/bin/sh
# Usage:  svnrevisions $file
# Output: list of fully numeric svn revisions (without the r), one per line

file="$@"
    svn log "$file" 2> /dev/null | awk '/^r[[:digit:]]+ \|/ { sub(/^r/,"",$1); print  $1 }'
James McGuigan
la source
«A» pour l'effort! (il suffit d'utiliser git :))
Expiation limitée
-1

Si vous essayez de déterminer quelle révision est responsable d'une ligne de code spécifique, vous recherchez probablement:

svn blame

Crédit: réponse originale

DustWolf
la source
-3

Je suis tombé sur ce script bash , mais je ne l'ai pas essayé.

Douglas Smith
la source