Использовать 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/текущая дата/номер конечной ревизии/, в котором будут изменившиеся между этими номерами ревизий с учётом вложенности каталогов.
Пользуйтесь. =)