Recherche dans l'historique de Subversion (texte intégral)
-
09-06-2019 - |
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.
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.
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.
Je cherchais la même chose et j'ai trouvé ça :
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é.