разреженное обновление svn глубокой структуры каталогов

Есть ли способ разреженной проверки репозитория SVN с глубокой вложенной структурой каталогов.

Я делаю это, используя список всех файлов в репо и фильтрацию только для *.xml:

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

Я пытаюсь сделать следующее:

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

Я попробовал это, но получил сообщение об ошибке, говорящее о пропуске обновления этого файла.

Если я вручную сделаю следующее, я смогу получить файл в своей кассе (я хочу, чтобы --set-depth был пустым, который получает родительские каталоги для вложенного пути SVN).

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

ИЗМЕНИТЬ

У меня сейчас есть 2 обходных пути, ни один из них не идеален

<сильный>1. обновление svn по частям --set-depth пуст

Я написал функцию bash, которая принимает путь к файлу, который я ищу, и выполняет svn update --set-depth для него пусто. Например, для project1/dirs/moreDirs/evenMore/file.xml это вызовет:

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

Это работает, но кажется, что это довольно медленно (возможно, я могу объединить вызовы для нескольких файлов в один вызов обновления svn). Я не могу делать несколько вызовов обновления svn для отдельных файлов параллельно, потому что svn блокирует репо.

Вот полный скрипт:

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$' | xargs -P 1 -n 1 -I{} bash -e -c 'getContentFile "$@"' _ {}

<сильный>2. svn cat для получения файлов

Я также могу просто создать путь для структуры папок и svn cat файла, и я могу сделать это для нескольких файлов одновременно, но это страдает от отсутствия подключения к svn (например, я не могу легко зафиксировать его обратно или обновить файл из svn без обхода и сопоставления пути), это не настоящая проверка svn.

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
}

person Dougnukem    schedule 20.11.2013    source источник
comment
А если получить отдельные файлы с помощью svn cat? Например svn cat "http://myRepo.com/trunk/path/to/file.xml" > "path/to/file.xml"   -  person janos    schedule 21.11.2013
comment
Я мог бы получить отдельные файлы и использовать mkdir -p $(dirname ${FILE_PATH}), но если я использую svn update --set-depth, я могу редактировать и отслеживать его в SVN (например, я мог бы вернуться к этим файлам или обновить до последний).   -  person Dougnukem    schedule 21.11.2013


Ответы (1)


Поскольку Subversion 1.7.0 update приняла опцию --parents, которая делает то, что вы хотите.

Таким образом, вы можете сделать следующее, например:

$ svn co --depth empty https://svn.apache.org/repos/asf/subversion svn-sparse
 U   svn-sparse
Checked out revision 1544721.

$ svn up --parents trunk/subversion/libsvn_ra_svn/protocol
A    trunk
A    trunk/subversion
A    trunk/subversion/libsvn_ra_svn
Updating 'trunk/subversion/libsvn_ra_svn/protocol':
A    trunk/subversion/libsvn_ra_svn/protocol
Updated to revision 1544721.
person Ben Reser    schedule 23.11.2013
comment
Это работает, но проверка по-прежнему очень медленная (угадывание каждого пути в обновлении svn делает удаленные вызовы). Запустив версию svn cat с xargs -P 50, можно открыть множество параллельных сетевых подключений. - person Dougnukem; 23.11.2013
comment
Да, это ходьба по дереву, так что на самом деле это ничем не отличается от того, что вы делали вручную. К сожалению, он не только делает несколько запросов, но и делает это в отдельных сеансах. Это означает, что он должен открыть новое TCP-соединение, согласовать SSL (если используется), выполнить аутентификацию (если требуется), выполнить запрос(ы) OPTIONS и, наконец, выполнить ОТЧЕТ. Мы должны заполнить ОТЧЕТ записью по всему пути. Точно так же, как мы делаем, если вы запускаете обновление после создания такой ситуации. - person Ben Reser; 23.11.2013
comment
@Dougnukem Сегодня вечером я поработал над улучшением этого. Если вы хотите попробовать (с помощью сборки исходного кода на стволе Subversion, мне было бы очень интересно, насколько это поможет). Я, вероятно, могу улучшить его еще больше, но это более навязчивое изменение, и это вдвое сократило время, которое мне потребовалось svn update --parents по сравнению с DAV. - person Ben Reser; 08.02.2014
comment
Похоже, это должен быть принятый ответ @Dougnukem - person solvingJ; 09.08.2018