Использовать svn я начал, работая в windows и соответственно в качестве клиента использовал TortoiseSVN.
В то время я был очень рад новой возможности, описанной в статье Умный экспорт из SVN при помощи TortoiseSVN.
Совсем недавно сделал то, что давно не находилось времени сделать — поставил на свой рабочий компьютер linux.
И вот незадача, ни в одном из графических клиентов, опробованных мной, не обнаружил схожей функциональности.
Мало того. Почитав svn --help не нашёл опции, дающий такой результат.
Обидно. Учитывая, что приучил уже отдел делать такие экспорты для плавного обновления проектов.
В-общем, не буду тянуть: написал на bash скрипт, реализующий сравнение и экспорт отличий между двумя ревизиями.
Прописать хост, на котором находится svn-сервер.
В результате в текущей директории появится каталог !UPDATES/текущая дата/номер конечной ревизии/, в котором будут изменившиеся между этими номерами ревизий с учётом вложенности каталогов.
Пользуйтесь. =)
В то время я был очень рад новой возможности, описанной в статье Умный экспорт из SVN при помощи TortoiseSVN.
Совсем недавно сделал то, что давно не находилось времени сделать — поставил на свой рабочий компьютер linux.
И вот незадача, ни в одном из графических клиентов, опробованных мной, не обнаружил схожей функциональности.
Мало того. Почитав svn --help не нашёл опции, дающий такой результат.
Обидно. Учитывая, что приучил уже отдел делать такие экспорты для плавного обновления проектов.
В-общем, не буду тянуть: написал на bash скрипт, реализующий сравнение и экспорт отличий между двумя ревизиями.
Код
#!/bin/bash
if [ $# -lt 2 ] ; then
echo "usage: start_revision end_revision [project_name]"
exit 0
fi
dir_prefix='!UPDATES/'
svn_repo='svn://<svn_host>:<svn_port>'
if [[ $3 != '' ]]
then
project=$svn_repo'/'$3'/'
fi
revision_start=$1
revision_end=$2
files=`svn diff --summarize -r $revision_start:$revision_end $project | awk '{print \$2}'`
echo "svn diff --summarize -r $revision_start:$revision_end $project | awk '{print \$2}'"
declare -a filelist
i=0
for file in $files;
do
dir=''
filelist[$i]=`echo $file | sed -e 's/\//\n/g'`
j=0
declare -a items
for item in ${filelist[$i]};
do
items[$j]=$item
j=`echo $j+1 | bc`
done
#create dirs
j=0
cur_dir=''
els_count=`echo ${#items[@]}-1 | bc`
for ditem in ${items[@]};
do
if [[ $j = $els_count ]] #if lat element - it's filename
then
#store filename
file_name=$ditem
break
fi
cur_dir=$cur_dir$ditem'/'
j=`echo $j+1 | bc`
done
dir=${dir_prefix}`date +%Y-%m-%d`'/'${revision_end}'/'$cur_dir
mkdir -p $dir
#export files in created dirs
svn export -r $revision_end $project$file ./$dir$file_name
i=`echo $i+1 | bc`
doneНастройка
Прописать хост, на котором находится svn-сервер.
Использование
- Набрать в директории с рабочей копией <имя скрипта> <начальная ревизия> <конечная ревизия>
- Либо набрать в произвольной директории <имя скрипта> <начальная ревизия> <конечная ревизия> <путь внутри репозитория>
В результате в текущей директории появится каталог !UPDATES/текущая дата/номер конечной ревизии/, в котором будут изменившиеся между этими номерами ревизий с учётом вложенности каталогов.
Пользуйтесь. =)
