2010-09-13 6 views
7

J'ai besoin de rechercher dans toutes les révisions d'un dépôt Subversion pour trouver les noms de fichiers et les numéros de révision qui contiennent une chaîne particulière. Je sais que cela va trouver des occurrences dans une décharge:Comment trouver/rechercher/grep un historique de référentiel SVN?

svnadmin dump $REPO_PATH | grep -i "Verdana" 

mais la sortie est trop cryptique. La sortie inclura des morceaux de fichiers binaires correspondant.

J'utilise des commandes comme celui-ci pour rechercher des chaînes dans la copie de travail en cours d'un projet:

find . -name "*.css" -print0 | xargs -0 grep "Verdana" 

Le format de sortie est utile, il donne à la fois le nom de fichier et la ligne dans laquelle la chaîne produit:

./css/forms.css: font  : 12px Verdana; 

Est-il possible de rechercher toutes les révisions d'un dépôt SVN pour dire, tous .css fichiers qui contiennent une chaîne de recherche? Et pas juste un mot mais une chaîne avec des caractères génériques ou une expression régulière comme grep?

Remarque: J'ai un accès root au serveur Linux avec le référentiel.

Notez également: Je ne souhaite pas rechercher une copie de travail, je dois rechercher toutes les révisions.

+0

Copie possible de [Exclure les répertoires .svn de grep] (http://stackoverflow.com/questions/1491514/exclude-svn-directories-from-grep) –

+0

Ceci n'est certainement pas un doublon de la façon d'exclure .svn répertoires de grep ... – quickshiftin

Répondre

0

Avez-vous essayé

svn log --verbose 

sur votre répertoire racine, l'impression de chaque message de journal et tous les chemins affectés. Il ne vous laissera pas analyser le contenu du fichier, mais vous pouvez au moins être en mesure de rechercher des fichiers .css.

+0

Oui, il semble y avoir beaucoup de solutions à la recherche de noms de fichiers. Le contenu est plus délicat. – Liam

+0

Vous pouvez utiliser 'diff' pour générer du texte en clair entre cette dernière version et n'importe quelle révision précédente. Peut-être que vous pouvez même limiter le 'diff' à certains fichiers, en fonction des résultats de 'svn log'. – zellus

+0

http://stackoverflow.com/questions/1118051/how-do-i-search-all-revisions-of-a-file-in-a-subversion-repository est un quasi-doublon de cette question, mais recherche toutes les révisions pour un seul fichier. http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=627008 semble être une approche intéressante, mais pas hors de la boîte. – zellus

5

Le moyen le plus simple (et le plus efficace que j'ai trouvé) de le faire, et il faut investir un peu de temps - cloner le dépôt svn dans git, puis utiliser gitk pour chercher dans le dépôt.

Puisque le référentiel entier est sur votre système local, il accélère la recherche infiniment plus rapidement!

J'avais l'habitude de gérer un grand dépôt subversion pour environ 30 développeurs, ils venaient souvent à mon bureau demandant, "pouvez-vous trouver ce changement ..", etc Je voudrais juste lancer gitk!

svn log est terriblement lent car il doit frapper le serveur. En outre, si vous avez accès au serveur, vous aurez probablement besoin de créer | grep -v ou similaire pour supprimer tous les répertoires .svn.

0

Pensez le long des lignes:

svn log $location -q | grep -P 'r\d+' -o | grep -P '\d+' -o | xargs -l1 svn diff -c | grep $pattern 

Je pense en ajustant les drapeaux que vous donnez à grep ou d'écrire un pipeline plus complexe (peut-être par une canalisation à une boucle au lieu d'utiliser xargs), vous pouvez grep SVN histoire pour quoi que ce soit.

Questions connexes