actualización svn escasa de la estructura de directorios profunda

¿Hay alguna forma de realizar una extracción dispersa de un repositorio SVN con una estructura de directorios anidada?

Estoy haciendo esto usando una lista de todos los archivos en el repositorio y filtrando solo por * .xml:

svn list --recursive "http://myRepo.com/trunk" > allFiles.txt

Estoy tratando de hacer lo siguiente:

svn checkout "http://myRepo.com/trunk" --depth empty "myRepo"
svn update --set-depth empty project1/dirs/moreDirs/evenMore/file.xml

Intenté esto, pero obtuve un error diciendo que se estaba saltando la actualización de ese archivo.

Si hago lo siguiente manualmente, puedo obtener el archivo en mi registro (quiero un espacio vacío en profundidad que obtenga los directorios principales para una ruta SVN anidada).

svn update --set-depth empty project1
svn update --set-depth empty project1/dirs/moreDirs
svn update --set-depth empty project1/dirs/moreDirs/evenMore
svn update --set-depth empty project1/dirs/moreDirs/evenMore/file.xml

svn status -v project1/dirs/moreDirs/evenMore/file.xml
# prints svn file information

EDITAR

Tengo 2 soluciones en este momento ni ideal

1. Actualización de svn de pieza - comida - profundidad de vacío

Escribí una función de bash que toma la ruta del archivo que estoy buscando para ejecutar svn update --set-depth vacío en ella. Por ejemplo paraproject1/dirs/moreDirs/evenMore/file.xml llamaría

svn update --set-depth empty updateproject1 updateproject1/dirs updateproject1/dirs/moreDirs updateproject1/dirs/moreDirs/evenMore updateproject1/dirs/moreDirs/evenMore/file.xml

Funciona pero parece que es bastante lento (tal vez pueda agrupar las llamadas de varios archivos en una llamada svn update). No puedo hacer varias llamadas de actualización svn para archivos separados en paralelo porque svn bloquea el repositorio.

Aquí está el guión completo:

function getContentFile() 
{

    CONTENT_FILE="$1"
    SVN_FILE="${SVN_REMOTE}${CONTENT_FILE}"
    LOCAL_CONTENT_FILE="${SVN_CHECKOUT}/${CONTENT_FILE}"
    LOCAL_CONTENT_FILE_DIR=$(dirname ${LOCAL_CONTENT_FILE})

    SVN_UPDATE_ARG="${CONTENT_FILE}"
    PARENT_DIR="$(dirname ${CONTENT_FILE})"
    if [ ! -e "${LOCAL_CONTENT_FILE}" ]; then
        pushd "${SVN_CHECKOUT}"
        while [ "$PARENT_DIR" != "." ]; do
            # Escape any spaces in the argument list being passed to svn update
            PARENT_ARG=$(echo $PARENT_DIR | sed 's/ /\\ /g')
            if [ -e "${SVN_CHECKOUT}/${PARENT_DIR}" ]; then
                # Stop if we detect a directory already controlled by SVN
                break
            fi
            SVN_UPDATE_ARG="$PARENT_ARG $SVN_UPDATE_ARG"
            PARENT_DIR="$(dirname ${PARENT_DIR})" || true
        done
        svn update --set-depth empty ${SVN_UPDATE_ARG}
    fi
}
# export function to use in xargs
export -f getContentFile

cat "$SVN_FILE_LISTING_CACHE" | egrep '\.xml

2. svn cat para obtener archivos

También puedo crear la ruta para la estructura de la carpeta y svn cat el archivo y puedo hacerlo en varios archivos al mismo tiempo, pero esto no se puede conectar a svn (por ejemplo, no puedo volver a enviarlo o actualizarlo). el archivo de svn sin caminar y coincidir con la ruta), no es un svn real checkout.

function getAllContentFiles() 
{
    FILE_REGEX="$1"
    #NUM_PROCESSORS=`sysctl hw.ncpu | awk '{print $2}'`
    # Do this in parallel (doesn't have to match number of actual processors)
    NUM_PROCESSORS=50
    #TODO: need to do it 1 at a time because of SVN lock for svn updates
    cat "$SVN_FILE_LISTING_CACHE" | egrep $FILE_REGEX | xargs -P ${NUM_PROCESSORS} -n 1 -I{} bash -ex -c 'getContentFile "$@"' _ {}
}

function getContentFile() 
{

    CONTENT_FILE="$1"
    SVN_FILE="${SVN_REMOTE}${CONTENT_FILE}"
    LOCAL_CONTENT_FILE="${SVN_CHECKOUT}/${CONTENT_FILE}"
    LOCAL_CONTENT_FILE_DIR=$(dirname ${LOCAL_CONTENT_FILE})

    SVN_UPDATE_ARG="${CONTENT_FILE}"
    PARENT_DIR="$(dirname ${CONTENT_FILE})"
    mkdir -p "${PARENT_DIR}"

    if [ ! -e "${LOCAL_CONTENT_FILE}" ]; then
        pushd "${SVN_CHECKOUT}"
        svn cat "${SVN_FILE}" > "${LOCAL_CONTENT_FILE}"
    fi
}
| xargs -P 1 -n 1 -I{} bash -e -c 'getContentFile "$@"' _ {}

2. svn cat para obtener archivos

También puedo crear la ruta para la estructura de la carpeta y svn cat el archivo y puedo hacerlo en varios archivos al mismo tiempo, pero esto no se puede conectar a svn (por ejemplo, no puedo volver a enviarlo o actualizarlo). el archivo de svn sin caminar y coincidir con la ruta), no es un svn real checkout.

function getAllContentFiles() 
{
    FILE_REGEX="$1"
    #NUM_PROCESSORS=`sysctl hw.ncpu | awk '{print $2}'`
    # Do this in parallel (doesn't have to match number of actual processors)
    NUM_PROCESSORS=50
    #TODO: need to do it 1 at a time because of SVN lock for svn updates
    cat "$SVN_FILE_LISTING_CACHE" | egrep $FILE_REGEX | xargs -P ${NUM_PROCESSORS} -n 1 -I{} bash -ex -c 'getContentFile "$@"' _ {}
}

function getContentFile() 
{

    CONTENT_FILE="$1"
    SVN_FILE="${SVN_REMOTE}${CONTENT_FILE}"
    LOCAL_CONTENT_FILE="${SVN_CHECKOUT}/${CONTENT_FILE}"
    LOCAL_CONTENT_FILE_DIR=$(dirname ${LOCAL_CONTENT_FILE})

    SVN_UPDATE_ARG="${CONTENT_FILE}"
    PARENT_DIR="$(dirname ${CONTENT_FILE})"
    mkdir -p "${PARENT_DIR}"

    if [ ! -e "${LOCAL_CONTENT_FILE}" ]; then
        pushd "${SVN_CHECKOUT}"
        svn cat "${SVN_FILE}" > "${LOCAL_CONTENT_FILE}"
    fi
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta