2009-03-25 14 views
80

¿Cómo puedo obtener una lista de todos los svn: externals (recursivamente) en un directorio? ¿Hay alguna utilidad para esto?Listar todo svn: externals recursivamente?

(Estoy utilizando Windows (y la tortuga))

Tengo un montón de svn: externos que une a diferentes partes compartidas de mi proyecto y yo cuando Branch es de error suele ser bastante propensos a encontrar todo lo externo y los cambié para que el enlace a las rutas dentro de la nueva rama.

+0

Esta pregunta también está presente en http://stackoverflow.com/questions/5118320/find-paths-with-svnexternal-properties-with-certain-string –

Respuesta

125

Haga lo siguiente en la raíz de su copia de trabajo:

svn propget svn:externals -R 

Como se discutió en los comentarios a continuación, no son listados externos en lo externo.

Nota para usuarios de TortoiseSVN: existe una opción en el instalador de TortoiseSVN para instalar también el cliente de línea de comando SVN. Esta opción no está habilitada por defecto.

+0

que sólo me da una lista de todos los externos y donde apuntan ... pero no la 'ubicación' del externo ... es decir, si tengo lib \ my_ex como externo solo obtengo my_ex http:/svnlinkhere – ShoeLace

+3

@ShoeLace: debes estar trabajando con un SVN antiguo porque en 1.6.1 la salida * does * contiene esta información. –

+0

Buena respuesta ... pero ¿cómo puedo hacer esto en Windows con TortoiseSVN? - No tengo un 'svn.exe' en mi computadora, pero tengo instalado TortoiseSVN. – Eddified

15

El cambio manual de todas esas propiedades externas suena tedioso. ¿Has mirado el new functionality for externals agregado en Subversion 1.5?

Subversion 1.5 da un gran paso para aliviar estas frustraciones. Como se mencionó anteriormente, las URL usadas en el nuevo formato de definición externa pueden ser relativas, y Subversion proporciona magia de sintaxis para especificar múltiples sabores de relatividad de URL.

../

      relativa a la URL del directorio en el que la propiedad svn: externos se establece

^/

      relativa a la raíz del repositorio en el que la propiedad svn: externals está versionada

//

      En relación con el esquema de la URL del directorio en el que la propiedad svn: externos se establece

/

      relativa a la URL raíz del servidor en el que la propiedad svn: propiedad externa es versionada

¿Quizás una de esas ayudaría? Supongo que depende exactamente de cómo se está bifurcando y cuál es la estructura de su repositorio.

0

Tal vez, como solución alternativa, podría estructurar su proyecto de tal forma que todos los elementos externos estén configurados en la misma carpeta, por ejemplo en la carpeta del proyecto justo debajo de Troncal. (Esto no significa que todas las carpetas externas tengan que estar a la misma profundidad por cierto.) Luego puede hacer clic derecho en la carpeta de su proyecto, luego Propiedades ..., luego la pestaña Subversión, luego Propiedades ... luego haga doble clic en svn: externals.

0

que utiliza la respuesta de Wim Coenen y escribió la siguiente secuencia de comandos para crear una lista de todas las revisiones:

getSvnRevs() { 
    cd "$1" 
    wcver="$(svnversion)" 
    [ -n "$wcver" ] || panic "Unable to get version for $wcdir" 
    echo "$1: $wcver" 
    svn propget svn:externals -R | while read a b c d e; do 
    [ -n "$a" ] || continue 
    if [ "$b" = "-" ]; then 
     wcparent="$a" 
     wcdir="$wcparent/$c" 
     [ -z "$e" ] || panic "Invalid format #1" 
    else 
     [ -n "$wcparent" ] || panic "Invalid format #2" 
     wcdir="$wcparent/$a" 
     [ -z "$c" ] || panic "Invalid format #3" 
    fi 
    [ -d "$wcdir" ] || panic "Invalid directory: $wcdir" 
    wcver="$(svnversion "$wcdir")" 
    [ -n "$wcver" ] || panic "Unable to get version for $wcdir" 
    echo "$1/$wcdir: $wcver" 
    done 
} 

Afortunadamente, no tengo externas anidadas, por lo que no tiene que probar esta y supongo que no funcionaría Pero si necesita esto, probablemente sea suficiente llamar a esta función recursivamente. Además, nunca probé con nombres de archivos que necesitan escaparse. Es probable que no funcione entonces.

DESCARGO DE RESPONSABILIDAD: Sé que la pregunta original era sobre Windows, y el script de shell no funcionará allí a menos que esté usando cygwin o similar.

7

Mi solución para TortoiseSVN:

Abra la "rama/etiqueta ..." de diálogo en el menú contextual SVN. El cuadro de diálogo inferior muestra todos los elementos externos, incluidos elementos externos anidados.

+0

Parece que TortoiseSVN no busca de manera recursiva svn: externals dentro de svn: externals, por lo que esto es lo mismo que hacer 'svn propget svn: externals -R'. – paulie4

0

Tomé Daniel Alder's answer, eliminé las llamadas a svnversion y las hice recursivas (NOTA: read a b c d e no funciona si hay un espacio en el origen o en el destino). Este es un script bash, por lo que necesitarás algo como Cygwin o usar el Windows Subsystem for Linux.

getSvnExternals() { 
    svnbase="$1" 
    svnpath="$2" 
    svn propget svn:externals -R "$svnbase/$svnpath" 2> /dev/null | while read a b c d e; do 
    [ -n "$a" ] || continue 
    if [ "$b" = "-" ]; then 
     wcparent="$a" 
     external="$c" 
     wcdir=$(echo "$wcparent/$d" | sed s#^./##) 
     [ -z "$e" ] || echo "WARNING: Invalid format #1. line='$a $b $c $d $e'" 
    else 
     [ -n "$wcparent" ] || echo "WARNING: Invalid format #2. wcparent=$wcparent" 
     external="$a" 
     wcdir=$(echo "$wcparent/$b" | sed s#^./##) 
     [ -z "$c" ] || echo "WARNING: Invalid format #3. line='$a $b $c $d $e'" 
    fi 
    echo "$1/$wcdir: $external" 
    ## recurse into external directory 
    [ -d "$wcdir" ] && getSvnExternals "$1/$wcdir" 
    done 
} 
Cuestiones relacionadas