SVN получение всех ревизий файла

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

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

каков самый быстрый способ достичь этого?

3
задан 3498DB
16.04.2023 16:33 Количество просмотров материала 3342
Распечатать страницу

3 ответа

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

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

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

4
отвечен David Z 2023-04-18 00:21

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

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

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

do
    svn cat -r $rev  > .$rev
done
2
отвечен Marius Gedminas 2023-04-18 02:38

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

#!/bin/bash
echo "svn log \"\" | grep ^r[0-9] | cut -c 2- | cut -d ' ' -f 1"
for rev in `svn log "" | grep ^r[0-9] | cut -c 2- | cut -d ' ' -f 1`; do
    svn log -r $rev
    #svn diff -r $[$rev-1]:$rev  2>/dev/null || svn cat -r $rev 
    `svn cat -r $rev "" > "$rev."`
done
1
отвечен David Williams 2023-04-18 04:55

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх