Получение измененных файлов из SVN

Делаем 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>