2008-10-10 8 views
9

J'ai un script automatisé de construction d'origine locale sous la forme d'un fichier de commandes DOS. Dans une partie de ce script, je vérifie (avec "svn checkout") une section de notre dépôt SVN qui inclut un tas de choses tierces utilisées dans nos projets. Ce fichier batch réalisé assez bien depuis longtemps, mais maintenant les gens ont vérifié dans beaucoup de peluches (docs, exemple de code, etc.) dans la zone tiers et la partie de la caisse de ce script a obtenu plus lent beaucoup. Je voudrais atténuer cela en vérifiant seulement les choses dont nous avons besoin - principalement des fichiers dll dans notre cas. Donc, ma question est la suivante: quelle est la meilleure façon de vérifier un référentiel SVN filtré par l'extension de fichier?Vérification SVN filtré par extension de fichier?

Je ne vois pas de façon évidente de le faire dans l'aide svn. J'ai une bibliothèque utilitaire .NET qui enveloppe svn.exe à certains égards, et je pensais étendre cela pour récupérer seulement le contenu qui correspond à mes extensions d'intérêt. Mais je préférerais utiliser une méthode plus simple ou existante s'il en existe une.

+0

Ceci est trop localisé. La question fait référence à des tiers svn ajoute – AlxVallejo

+0

@AlxVallejo Non, ce n'est pas. Cela fait référence à svn.exe. –

Répondre

21

Ceci est possible: vous pouvez svn checkout un répertoire vide, puis svn update filename pour chaque fichier que vous faites veulent.

Votre script peut faire quelque chose comme:

  1. svn checkout svn://path/to/repos/directory --depth empty
  2. svn list --recursive svn://path/to/repos/directory
  3. tuyau résultant à travers un filtre qui supprime les extensions de fichiers interdits, par exemple grep
  4. itérer sur cette nouvelle liste filtrée et svn update --parents chaque fichier

Cela donnerait le résultat souhaité d'une copie de travail sans certains fichiers ou extensions de fichier.

Bien sûr, il y a aussi la question que vous évoquez de « personnes [vérifier] dans beaucoup de peluches » mais c'est une question distincte.

+1

Vous pouvez également jeter un coup d'œil au support de subversion de la fourmi: http://subclipse.tigris.org/svnant/svn.html – tonyo

+1

à quoi ressemble une implémentation de ceci? – Pup

+2

J'ai essayé d'implémenter cette approche moi-même mais je pense que je me trompe. Je reçois des conflits de chemins ignorés. – aaaantoine

0

Vous ne pouvez pas vérifier quelques fichiers spécifiques - vous ne pouvez vérifier un dossier entier. Vous pouvez réorganiser l'organisation de ce que vous vérifiez, ou vous pouvez simplement copier une copie de travail d'un autre endroit et mettre à jour.

3

Comme je l'ai dit here, il n'y a qu'une seule option à construire dans SVN lui-même: Une nouvelle fonctionnalité dans SVN 1.5 appelé caisse clairsemée, mais vous ne pouvez pas commander de sélection au niveau du répertoire, donc vous devez trier les fichiers que vous faites pas besoin dans un répertoire différent.

+2

Merci de faire remarquer aux répertoires Sparse - ils sont fonctionnalité très puissante. Pour tous les intéressés http://bit.ly/99Nblk est le chapitre pertinent de svn-book. –

+0

Donc, en d'autres termes, il n'y a pas moyen de filtrer une vérification svn par extension. – AlxVallejo

-3

La façon la plus simple et la plus correcte de le faire: NE LE FAITES PAS!

S'il y a une merde dans le dossier tiers où il devait y avoir des fichiers .dll qui doit être la caisse - enlever cette merde à un autre endroit! Cela n'a pas sa place ici de toute façon.

0

Pour une mise en œuvre spécifique de la réponse powershell de Michael Hackner, essayer quelque chose comme:

svn ls http://svn-server/src --recursive | Out-File svn.txt 
Get-Content .\svn.txt | where {$_.toLower().EndsWith('special.xml')} | select -First 200 | foreach {New-Object PSObject -Property @{ Path = $_; Munged = $_.Replace('/', '_') } } | foreach { svn export "http://svn-server/src/$($_.Path)" $($_.Munged) } 

Mon cas particulier d'utilisation est de trouver ici un tas de fichiers de même nom (dans ce cas * special.xml) et le dumping tous dans un seul dossier, avec des noms essentiellement uniques. J'ai utilisé un fichier intermédiaire pour stocker l'ensemble de la liste de repo, mais tout ceci pourrait également être ajouté si cela est mieux pour vous.

0

Je viens d'essayer l'approche présentée par Michael Hackner. Voici la mise en œuvre pour un système DOS. Notez que vous devez extraire le dossier vide avant d'exécuter ce script.

@echo off 

svn list --recursive https://path_to_repository_folder | find /I ".sql" > filelist.txt 

REM Specify a custom delim. Otherwise space in filename will be treated as a delimiter. 
FOR /F "delims=|" %%i IN (filelist.txt) DO (
    echo ------------- 
    echo %%i 
    svn update --parents "%%i" 
) 
Questions connexes