Как экспортировать измененные файлы между двумя версиями SVN - PullRequest
6 голосов
/ 07 сентября 2011

Как я могу экспортировать измененные файлы в SVN, которые изменились между двумя ревизиями.Мне нужно решение либо через командную строку, либо с помощью любых сценариев (с правильной структурой папок).Кроме того, мне нужно решение на основе Windows.

например, sth like:

export {svn diff --summarize -r 50:HEAD}

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

Ответы [ 6 ]

12 голосов
/ 10 сентября 2011

Вот отличное пошаговое руководство, которое делает это с помощью TortoiseSVN * Сравнить ревизии и Экспорт выбора в ... функции:

http://www.electrictoolbox.com/tortoisesvn-exporting-changed-files/

10 голосов
/ 13 сентября 2011

Насколько я знаю, svn не предоставляет такой возможности.Но вы можете написать простую программу на c #, используя для этого SharpSVN .Вот пример, который вы можете использовать.В этом примере я получаю весь измененный файл от версии 100 до 200.

using SharpSvn;
using System.IO;
using System.Collections.ObjectModel;
using Microsoft.VisualBasic;

namespace SvnDiffExporter
{
    class Program
    {
        static void Main(string[] args)
        {
            SvnClient client = new SvnClient();
            SvnRevisionRange range = new SvnRevisionRange(100, 200);
            MemoryStream result = new MemoryStream();

            Collection<SvnLogEventArgs> items;
            SvnLogArgs logargs = new SvnLogArgs(range);
            client.GetLog(@"e:\Artifacts", logargs, out items);

            int i = 0;
            string [] path = new string[255];
            foreach (SvnLogEventArgs ar in items)
            {
                foreach (SvnChangeItem changeitem in ar.ChangedPaths)
                {
                    if (changeitem.Action != SvnChangeAction.Delete)
                    {
                        path[i] = changeitem.Path;
                        i++;
                    }
                }
            }

            string localpath = @"c:\data";
            foreach (string str in path)
                client.Export(str, localpath);
        }
    }
}
4 голосов
/ 27 июня 2016

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

@echo off

FOR /F "tokens=1,2" %%I IN ('svn diff --summarize -r %1') DO (
    IF NOT %%I == D (
        IF NOT EXIST %2\%%J\.. mkdir %2\%%J\..

        svn export --depth empty -q --force %%J %2\%%J
        echo %2\%%J
    )
)

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

C:\YourRepository>svnexport.bat 1:10 C:\Export
1 голос
/ 09 июля 2013

Вот еще одна опция, написанная в bash-скрипте:

#!/bin/bash

##############################
# settings and inicilization #
##############################

SVN_SOURCE="https://svn.example.com/trunk/"
REV_PATH="/var/www/revisions/example.com/"

TIME_SPENT=$(date +%s)
REV=$(svn info $SVN_SOURCE | grep Revision | cut -d ' ' -f 2)
PREV=0
VERBOSIVE=0

USAGE_INFO="$(basename "$0") [-r REVISION_NUM] [-i PREVIOUS_REVISION_NUM] -- make an incremental svn export

where:
  -i  previous revision (default: 0)
  -h  show this help text
  -r  revision to export (default: $REV)
  -v  verbosive mode. show fetched files

current settins:
  SVN_SOURCE: $SVN_SOURCE
  REV_PATH:   $REV_PATH
"

while getopts r:i:hv option; do
  case "$option" in
    i)  PREV=$OPTARG
        ;;
    h)  echo "$USAGE_INFO"
        exit
        ;;
    r)  REV=$OPTARG
        ;;
    v)  VERBOSIVE=1
        ;;
  esac
done

EV_PATH=$REV_PATH$REV"/"

##############################
#         functions          #
##############################

promtYesOrDie(){
  while true; do
    read -e -p "$1 (y/n): " -i "y" yn
    case $yn in
      [Yy] ) break;;
      [Nn] ) echo "spent: "$((`date +%s` - $TIME_SPENT))"s"
             echo "bye bye"
             exit
             ;;
         * ) echo "Please answer (y)es or (n)o.";;
    esac
  done
}

doIncrementalExport(){
  PREV_PATH=$REV_PATH$PREV"/"
  if [ -d $PREV_PATH ]; then
    echo "copying files from: $PREV_PATH"
    cp -f -r "$PREV_PATH." $EV_PATH
    echo "fetching added and modified files since revision $PREV..."
    for FILE_SRC in $(svn diff --summarize -r $PREV:$REV $SVN_SOURCE | awk '/[AM]/ {print $2}'); do
      FILE_PATH=$(echo $FILE_SRC | sed -e "s{$SVN_SOURCE{{");
      if [ ! -d "$EV_PATH$FILE_PATH" ]; then
        TRG_DIR="$EV_PATH$(dirname $FILE_PATH)"
        mkdir -p $TRG_DIR
        svn export -r$REV -q --force $FILE_SRC "$EV_PATH$FILE_PATH"
        if [ $VERBOSIVE -eq 1 ]; then
          echo "$EV_PATH$FILE_PATH"
        fi
      fi
    done
    echo "removing deleted files and folders since revision $PREV ..."
    for FILE_SRC in $(svn diff --summarize -r $PREV:$REV $SVN_SOURCE | awk '/D/ {print $2}'); do
      FILE_PATH=$(echo $FILE_SRC | sed -e "s{$SVN_SOURCE{{");
      rm -r "$EV_PATH$FILE_PATH"
      if [ $VERBOSIVE -eq 1 ]; then
        echo "$EV_PATH$FILE_PATH"
      fi
    done
  else
    echo "previous revision does not exist at: $PREV_PATH"
    exit;
  fi
}

##############################
#       main function        #
##############################

if [ $PREV -eq 0 ]; then
  promtYesOrDie "Do you want to do full export instead of incremental, for revision $REV of repo: [$SVN_SOURCE]"
  echo "fatching source ..."
  if [ $VERBOSIVE -eq 1 ]; then
    svn export -r$REV --force $SVN_SOURCE $EV_PATH
  else
    svn export -r$REV -q --force $SVN_SOURCE $EV_PATH
  fi
else
  promtYesOrDie "Do you want to do incremental export, for revision renge $PREV:$REV of repo: [$SVN_SOURCE]"
  doIncrementalExport
fi

echo "spent: "$((`date +%s` - $TIME_SPENT))"s"
echo [done]

Я использую полный скрипт , чтобы выполнить пошаговый экспорт SVN в производственную среду LAMP.

0 голосов
/ 08 марта 2019

Хотя пост @hsalimi может работать, если кто-то может использовать решение на C #, пост @kicken чрезвычайно эффективен в качестве решения для Windows.

К сожалению, я не нашел способа использовать репозиторий. Мне пришлось сначала проверить нужную мне ревизию в каталоге, а затем запустить скрипт в каталоге «рабочая копия».

Я не смог использовать его, как опубликовано, однако. Это небольшое переписывание сработало для меня:

FOR /F "tokens=1,2,3" %%I IN ('svn diff --summarize -r %1 %3') DO (
    IF NOT %%I == D (
        IF NOT EXIST %2\ mkdir %2\
        svn export --depth empty -q --force %%J %2
        echo exported: %2
    )
)

Для запуска также необходим SVN_URL:

C:\YourRepository>svnexport.bat 1:10 C:\Export <pathToWorkingDirectory>

(я знаю, что это был очень старый пост, но СПАСИБО @kicken за прекращение моего длительного поиска решения)

0 голосов
/ 11 сентября 2011

Если я правильно понимаю ваш вопрос, вас не интересует глобальный патч между ревизиями. В этом случае вам необходимо экспортировать каждую ревизию в отдельный каталог, а затем использовать инструмент, подобный Beyond Compare (или что-нибудь эквивалентное, например, WinMerge), для идентификации измененных файлов.

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

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