Есть ли способ разрезать репозиторий 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
}
И если вы получите отдельные файлы с помощью 'Svn cat'? Например, 'svn cat 'http://myRepo.com/trunk/path/to/file.xml"> "путь/to/file.xml" ' – janos
Я могу получить отдельные файлы и использовать mkdir -p $ (dirname $ {FILE_PATH}), но если я использую svn update --set-depth, я могу редактировать и отслеживать его в SVN (например, я мог бы вернуть эти файлы или обновить их до последней). – Dougnukem