6

У меня есть хранилище среднего размера (около 2500 версий) из проекта, которым я руководил в течение последних 3 лет. Там есть определенный файл (назовем его foo.xml), который я сейчас хочу проанализировать его эволюцию. В идеале, то, что я ищу, это экспортировать в каталог все версии этого файла с добавлением даты, например

2007_08_08_foo.xml
2007_08_09_foo.xml
2007_08_15_foo.xml
...

Какой самый быстрый способ достижения этого?

3 ответа3

4

Я не думаю, что в SVN встроена эта функциональность, но если вы можете запускать команды на сервере, который содержит репозиторий SVN (и при условии, что на сервере есть стандартные доступные инструменты UNIX/Linux), этот сценарий bash должен это делать вы:

REPOS=/path/to/repos
FILE=dir/foo.xml
for rev in "$(svnlook history $REPOS $FILE | awk 'NR > 2 { print $1 }')"; do
    rev_date=$(svnlook date -r $rev $REPOS | awk '{ print $1 }')
    svnlook cat -r $rev $REPOS $FILE > ${rev_date}_${FILE}
done

Это создаст имена файлов в формате 2007-08-08_foo.xml . Конечно, вы должны изменить /path/to/repos в первой строке на фактический путь к файловой системе (не URL) репозитория, и dir/foo.xml во второй строке на путь к файлу в репозитории ,

Если для вас действительно важно иметь подчеркивание в дате, измените строку 4 следующим образом:

    rev_date=$(svnlook date -r $rev $REPOS | awk '{ print $1 }' | tr - _)

Также имейте в виду, что если файл когда-либо изменялся более одного раза в определенный день, в записанных файлах будет отражено только первое редактирование каждого дня.

2

Мой коллега написал этот скрипт для аналогичной цели:

#!/bin/bash
for rev in `svn log $1 | grep ^r[0-9] | cut -c 2- | cut -d ' ' -f 1`; do
    svn log -r $rev
    svn diff -r $[$rev-1]:$rev $1 2>/dev/null || svn cat -r $rev $1
done

Вам не нужен доступ к серверу, чтобы запустить его; запустите его в каталоге, в котором этот файл извлечен, и передайте имя файла в качестве аргумента. Возможно, вы захотите изменить тело цикла для записи полных файлов вместо печати различий в стандартный вывод:

do
    svn cat -r $rev $1 > $1.$rev
done
1

У меня были проблемы с одним из сценариев в этом ответе, он не работал, когда в имени файла был пробел. Я не мастер в bash-скриптинге, но это быстрое решение.

#!/bin/bash
echo "svn log \"$1\" | grep ^r[0-9] | cut -c 2- | cut -d ' ' -f 1"
for rev in `svn log "$1" | grep ^r[0-9] | cut -c 2- | cut -d ' ' -f 1`; do
    svn log -r $rev
    #svn diff -r $[$rev-1]:$rev $1 2>/dev/null || svn cat -r $rev $1
    `svn cat -r $rev "$1" > "$rev.$1"`
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .