有没有办法对具有深层嵌套目录结构的 SVN 存储库进行稀疏检出。
我正在使用 repo 中所有文件的列表并仅过滤 *.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 empty 来获取嵌套 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 update --set-depth empty
我编写了一个 bash 函数,它采用我正在寻找的文件路径执行 svn update --set-depth empty 。例如,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 update 调用中)。我不能同时对单独的文件进行多个 svn update 调用,因为 svn 锁定了 repo。
这是完整的脚本:
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
}