Rechercher dans le référentiel SVN un nom de fichier


84

Nous avons un référentiel en vrac pour le code contenant des milliers de dossiers et de sous-dossiers, je veux rechercher sous ce référentiel avec le nom de fichier ou avec un mot.

Root folder
    a\
    b\
    c\
    d\
    e\
    f\ab\
    f\ab\cd.txt

Je veux rechercher cd.txt mais je ne sais pas où il se trouve dans le référentiel SVN, pour cela je veux effectuer une recherche sur le dossier racine de SVN où je mettrai le nom de fichier cd.txt et exécuterai la commande, je m'enregistrerai chaque dossier et affichera le résultat des détails du fichier ....

L'exigence d'espoir est claire. Pouvez-vous s'il vous plaît m'aider à ce sujet.


J'espérais qu'il y avait une commande côté client que vous pourriez entrer qui effectuerait la recherche côté serveur. Ce repo SVN avec lequel je travaille a des temps de réponse et un taux de transfert terribles sur VPN. Hélas, cela ne semble pas possible.
Patrick M le

Réponses:


60

Si le fichier est dans votre copie de travail, alors si vous utilisez svn 1.5:

svn list --depth infinity | grep <filename>

ou une version antérieure de svn:

find . -name <filename> -not -path '*.svn*'

Si vous avez besoin de trouver le fichier dans l'historique (supprimé ou déplacé):

svn log -v | less

et recherchez-le avec:

\<filename><return>

3
svn list --depth infinity fonctionne bien, dans Windows bien sûr, vous n'aurez pas grep par défaut, je viens de le vider dans un fichier texte et de le rechercher avec un éditeur de texte:
Mandrake

4
Dans Windows PowerShell, vous pouvez utiliser ... | select-string <filename>en remplacement de grep.
MarnixKlooster ReinstateMonica

2
Dans une ligne de commande Windows standard ... | find "<filename>"fonctionnera également en remplacement de grep. REMARQUE : les "sont obligatoires autour du nom de fichier.
Raystorm

7
Si le fichier est dans ma copie de travail, je n'ai pas besoin de svn pour le trouver. Vous devriez ajouter comment rechercher le repo comme les réponses d'Anton et de Marios. C'est peut-être évident pour vous, mais ce sont leurs réponses qui ont allumé la lumière pour moi.
Lieven Keersmaekers

1
Vous pouvez svn co --depth empty REPOURL RepoDir, cd RepoDiret svn list --depth infinitypuis obtenir tous les chemins de fichiers à partir du serveur SVN (éventuellement produire des millions de lignes si vous avez des millions).
Ivan Akcheurov

58

Ce qui suit fonctionne pour moi (svn version 1.4.6)

svn list -R <URL> | grep "<file_pattern>"

6
Génial. Cela fonctionne pour Tortoise. Sous Windows: svn list -R myurl >> results.txt
live-love

Fonctionne vraiment bien. Aussi beaucoup plus facile à retenir que "-R" que "--depth infinity".
MPV

lent pour les gros dépôts, alors mieux vaut utiliser svn-crawler ci-dessous.
karsten le

17

Avec l'accès au dépôt lui-même, utilisez (c'est-à-dire sur votre système de fichier hôte svn)

svnlook tree [path_to_repo] | grep [file_name]  

ou pour rechercher tous les dépôts (si vous avez plusieurs configurations de dépôts).

for i in \`ls [path_to_repos_dir]`; do echo $i; svnlook tree [path_to_repos_dir]/$i | grep -i [file_or_folder_name]; done 

l'option --full-path donnera le chemin complet du repo vers le fichier (si trouvé)

exemple:

for i in `ls /u01/svn-1.6.17/repos`; do echo $i; svnlook tree --full-paths /u01/svn- 1.6.17/repos/$i | grep -i somefile.txt; done

redirige la sortie vers un fichier si une copie statique est nécessaire.
suppose l'utilisation de nix OS.


3
+1 pour utiliser "svnlook tree --full-path <chemin_à_repo> | grep <filename>". C'est le moyen le plus rapide que j'ai trouvé pour effectuer une recherche de fichiers dans un dépôt subversion.
Nick Grealy

recherche ultra-rapide, très utile.
Dustin Cook

12

svn list --depth infinity <your-repo-here>pour obtenir une liste des fichiers dans le référentiel, puis svn catpour obtenir le contenu. Vous pouvez ajouter une --xmlclé à la listcommande pour rendre l'analyse un peu plus simple.


N'oubliez pas d'utiliser grepsi vous voulez voir 1 fichier, surtout si vous avez des milliers de fichiers dans le référentiel comme l'OP. En outre, il existe un --incrementalmode si vous devez joindre la sortie avec une sortie XML ultérieure / antérieure.
trysis le

6

Récemment, j'ai publié mon utilitaire pour lister le dépôt, c'est beaucoup plus rapide que l'approche "svn ls --depth infinity". Voici les repères . Il appelle simplement une fonction disponible dans l'API interne de Subversion, mais désormais accessible via une ligne de commande.

Alors tu peux courir

$ svn-crawler <URL> | grep "<file_pattern>"

Bel outil. J'ai testé avec CentOS7. J'ai dû ajouter libsvn_delta et libsvn_subr à la liste target_link_libraries dans CMakeLists.txt, également adapter LIBAPR_LIBRARY_INCLUDE de "include / apr-1.0" à "include / apr-1".
karsten le

4

Si vous utilisez TortoiseSVN, vous pouvez essayer ceci SI vous êtes prêt à regarder Projet par Projet - fonctionne pour moi:

  1. Créez un projet vide sous l'URL de premier niveau de votre référentiel, appelez-le BLANK
  2. Cliquez sur l'URL du repo dans le volet gauche
  3. Dans le volet de droite, sélectionnez votre projet BLANK et le projet souhaité - disons trunk
  4. Faites un clic droit pour faire apparaître le menu du navigateur et sélectionnez «Comparer les URL», selon la taille de votre dépôt, le chargement peut prendre une minute. Mais vous obtenez en gros votre liste de projets entière dans une liste «prête à rechercher».
  5. Entrez votre nom de fichier ou une autre chaîne dans le filtre de recherche


-2

Si votre dépôt distant n'est pas énorme, alors une méthode simple est la suivante: vous pouvez faire une "extraction" pour obtenir un dépôt local. Si vous êtes sur une machine Windows, vous utilisez "Rechercher" ou une machine Linux utilisez la commande "Rechercher".

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.