2008-10-10 15 views
9

Tengo una secuencia de comandos automatizada de construcción en forma de un archivo por lotes de DOS. En parte de ese script, reviso (con "svn checkout") una sección de nuestro repositorio SVN que incluye un montón de cosas de terceros que se usan en nuestros proyectos. Este archivo de proceso por lotes funcionó bastante bien durante mucho tiempo, pero ahora las personas han registrado un montón de pelusas (documentos, código de muestra, etc.) en el área de terceros y la parte de pago de esta secuencia de comandos se ha vuelto mucho más lenta. Me gustaría mitigar esto revisando solo las cosas que necesitamos, principalmente archivos dll en nuestro caso. Entonces, mi pregunta es esta: ¿cuál es la mejor manera de verificar un repositorio SVN filtrado por la extensión de archivo?Pago de SVN filtrado por extensión de archivo?

No vi ninguna forma obvia de hacer esto en la ayuda de svn. Tengo una biblioteca de utilidades .NET que envuelve svn.exe de alguna manera, y estaba pensando en extender esto para recuperar solo contenido que coincidiera con mis extensiones de interés. Pero preferiría usar un método más fácil o existente, si existe.

+0

Esto está demasiado localizado. La pregunta se refiere a un tercero. Svn agrega – AlxVallejo

+0

@AlxVallejo No, no lo es. Se refiere a svn.exe. –

Respuesta

21

Esto es posible: se puede svn checkout un directorio vacío, y luego svn update filename para cada archivo que hace quieren.

Su script puede hacer algo como:

  1. svn checkout svn://path/to/repos/directory --depth empty
  2. svn list --recursive svn://path/to/repos/directory
  3. de tuberías que dan lugar a través de un filtro que elimina las extensiones de archivos prohibidos, por ejemplo, grep
  4. iterar sobre esta nueva lista filtrada y svn update --parents cada archivo

que daría a su resultado deseado de una copia de trabajo sin ciertos archivos o extensiones de archivo.

Por supuesto, también está la cuestión de que mencionas "gente [revisando] con mucha pelusa", pero ese es un asunto aparte.

+1

Es posible que también desee echarle un vistazo al soporte de subversión de ant: http://subclipse.tigris.org/svnant/svn.html – tonyo

+1

¿Cómo funciona una implementación de este aspecto? – Pup

+2

Intenté implementar este enfoque yo mismo, pero creo que lo estoy haciendo mal. Me saltan los conflictos de ruta. – aaaantoine

0

No puede verificar solo algunos archivos específicos; solo puede consultar una carpeta completa. Puede reorganizar la organización de lo que está revisando, o puede simplemente copiar una copia de trabajo desde otro lugar y actualizar.

3

Como me dijeron que here, sólo hay una opción de construir en sí mismo SVN: Una nueva característica en el SVN 1.5 llamada pago y envío escasa, sin embargo, solamente podrá seleccionar la salida el nivel de directorio, así que hay que ordenar los archivos que haces no es necesario en un directorio diferente.

+2

Gracias por señalar a Sparse Directories: son una característica realmente poderosa. Para todos los interesados, http://bit.ly/99Nblk es el capítulo relevante de svn-book. –

+0

En otras palabras, no, no hay forma de filtrar un check de svn por extensión. – AlxVallejo

-3

La manera más simple y correcta de hacerlo: ¡NO LO HAGA!

Si hay alguna porquería en la carpeta de terceros donde se supone que hay archivos .dll que deben ser procesados ​​- ¡elimine esa basura en una ubicación diferente! No pertenece aquí de todos modos.

0

Para una implementación específica PowerShell de la respuesta de Michael Hackner, intentar algo como:

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) } 

Mi caso de uso particular en este caso es encontrar un montón de archivos con nombres similares (en este caso * special.xml) y el vertido todos en una sola carpeta, con nombres esencialmente únicos. He usado un archivo intermedio para almacenar todo el listado de repo, pero esto también podría incluirse si es mejor para ti.

0

Acabo de probar el enfoque presentado por Michael Hackner. A continuación se muestra la implementación de un sistema DOS. Tenga en cuenta que debe verificar la carpeta vacía antes de ejecutar este 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" 
) 
Cuestiones relacionadas