2013-11-20 1 views
3

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

Я делаю это с помощью списка всех файлов в репозиторий и фильтрации для всего * .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 

EDIT

У меня 2 обходных сейчас ни идеального

1. штучной еда обновления СВН --set глубины пустого

Я написал функцию Баша который берет путь к файлу, который я ищу, для выполнения 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 "[email protected]"' _ {} 

2. СВН кошка, чтобы получить файлы

Я также могу просто создать путь для структуры папок и СВН кошачьей файл, и я могу это сделать на нескольких файлах одновременно, но это связано с тем, что он не подключен к 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 "[email protected]"' _ {} 
} 

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 
} 
+0

И если вы получите отдельные файлы с помощью 'Svn cat'? Например, 'svn cat 'http://myRepo.com/trunk/path/to/file.xml"> "путь/to/file.xml" ' – janos

+0

Я могу получить отдельные файлы и использовать mkdir -p $ (dirname $ {FILE_PATH}), но если я использую svn update --set-depth, я могу редактировать и отслеживать его в SVN (например, я мог бы вернуть эти файлы или обновить их до последней). – Dougnukem

ответ

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. 
+0

Это работает, все еще очень медленно проверять (угадывание каждого пути в svn update делает удаленные вызовы). Запуск версии 'svn cat' с xargs -P 50 позволяет открывать много параллельных сетевых подключений. – Dougnukem

+0

Да, это идет по дереву, так что это действительно ничем не отличается от того, что вы делали вручную. К сожалению, он не только делает несколько запросов, но и делает это в отдельных сеансах. Это означает, что он должен открыть новое TCP-соединение, согласовать SSL (если он используется), обработать аутентификацию (если требуется), выполнить запрос (ы) OPTIONS, а затем, наконец, выполнить ОТЧЕТ. Мы должны заполнить ДОКЛАД с записью по всему пути. То же самое мы делаем, если вы запускаете обновление после создания такой ситуации. –

+0

@ Dougnukem [Я сделал некоторые работы сегодня, чтобы улучшить это] (http://svn.apache.org/r1565920). Если вы хотите дать ему вращение (через исходную сборку на Subversion trunk, мне было бы очень интересно, насколько это помогает). Я, вероятно, могу улучшить его больше, но это более навязчивое изменение, и это сократило время, когда «svn update -parents» взял меня за DAV. –