Question

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

Par exemple, j'ai écrit une fonctionnalité que j'ai utilisée quelque part, mais elle n'était pas nécessaire, j'ai donc svn rm'd les fichiers, mais maintenant je dois la retrouver pour l'utiliser pour autre chose.Le journal SVN indique probablement quelque chose comme "éléments inutilisés supprimés", et il existe de nombreux enregistrements comme celui-ci.

Modifier le 15/04/2016 : 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 de validation, et non les noms de fichiers et/ou les messages de validation.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 tout aussi bien rechercher uniquement un nom de fichier et/ou un message de validation.D'où une grande partie du svn log réponses et commentaires.

Était-ce utile?

La solution

git svn clone <svn url>
git log -G<some regex>

Autres conseils

svn log dans Apache Subversion 1.8 prend en charge un nouveau --search option.Vous pouvez ainsi rechercher les messages du journal de l'historique du référentiel Subversion sans utiliser d'outils et de 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 SVNLivre | svn log référence de ligne de commande.

Si vous utilisez Windows, jetez un œil à Requête SVn.Il maintient un index de texte intégral des référentiels locaux ou distants.Chaque document jamais validé dans un référentiel est indexé.Vous pouvez effectuer des requêtes de type Google à partir d’une simple interface Web.

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 le svnadmin dump commandez et comprenez cela.

La meilleure façon que j'ai trouvée de procéder est avec moins :

SVN LOG --verbose | moins

Une fois que moins obtient un résultat, vous pouvez appuyer sur / pour rechercher, comme VIM.

Modifier:

Selon l'auteur, il ne souhaite pas rechercher uniquement les messages et les noms de fichiers.Dans ce cas, vous devrez le pirater en ghetto avec quelque chose comme :

svn diff -r0:HEAD | less

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

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

svn log -v [repository] > somefile.log

pour la différence, vous pouvez utiliser le --diff option

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

puis utilisez vim ou nano ou tout ce que vous aimez, et effectuez 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.

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

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

Je cherchais la même chose et j'ai trouvé ça :

http://svn-search.sourceforge.net/

Je viens de rencontrer ce problème et

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

a 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.

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

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

J'ai écrit ceci sous forme de script bash cygwin pour résoudre ce problème.

Cependant, cela nécessite que le terme de recherche se trouve actuellement dans le fichier du système de fichiers.Pour tous les fichiers qui correspondent au grep du système de fichiers, un grep de toutes les différences svn pour ce fichier est ensuite effectué.Pas parfait, mais devrait être suffisant 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 }'

Je fais habituellement quoi Jack M. dit (utilisez svn log --verbose) mais je dirige vers grep au lieu de moins.

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top