Делаем svn log для указанных ревизий с указанием измененных файлов.
Получается список файлов измененных не между ревизиями, а "включительно", включая
изменения, сделанные в первой и в последней ревизии.
Список изменений получаем в виде XML и пропускаем через небольшое XSLT преобразование,
чтобы получить обычный текстовый список измененных файлов. В качестве XSLT-процессора
используется Xalan. Этот этап можно заменить другим способом разбора вывода
svn log, например воспользоваться egrep или awk,
кому что ближе.
Каждый файл выводится отдельно командой svn cat. Перед выводом создается
каталог для размещения файла. Если файл нулевого размера - он удаляется (это не файл, а
каталог, созданный в репозитории, по выводу svn log нельзя отличить его
от файла).
Файл /home/gelin/bin/svn-get:
#!/bin/sh
SVN_REPOS="file:///home/gelin/svn"
XSL="/home/gelin/etc/svn/log2files.xsl"
REPOS_PATH=$1
FROM_REV=$2
TO_REV=$3
shift
if [ -$2- == -- ]
then
echo Usage: svn-get PATH_IN_REPOSITORY FROM_REVISION TO_REVISION
exit
fi
LOG_CMD="svn log -v -q $SVN_REPOS/$REPOS_PATH --revision $FROM_REV:$TO_REV --xml"
echo $LOG_CMD
for file in `$LOG_CMD | xalan -XSL $XSL 2>/dev/null | uniq`
do
echo $file
mkdir -p `dirname .${file}`
svn cat ${SVN_REPOS}${file} --revision $TO_REV > .${file}
# if file is zero-length then delete it, it's not a file, it's a directory created in repository
if [ -e .${file} -a ! -s .${file} ]
then
rm .${file}
fi
done
Простое XSLT-преобразование. Файл /home/gelin/etc/svn/log2files.xsl:
<?xml version="1.0" encoding="utf-8"?>
<!--
(c) 2006, Denis Nelubin
transforms SVN log in XML format to list of changed files between revisions
-->
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="//path[@action = 'A'] | //path[@action = 'M']">
<xsl:value-of select="."/><xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="text()|@*"/>
</xsl:transform>