2011-09-07 13 views
6

¿Cómo puedo exportar archivos modificados en SVN que han cambiado entre dos revisiones? Necesito una solución, ya sea a través de la línea de comandos o mediante el uso de scripts (con la estructura de carpetas adecuada). Además, necesito una solución basada en Windows.Cómo exportar archivos cambiados entre dos revisiones SVN

p. Ej. algo así como:

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

Quiero un árbol de directorios con una copia de los archivos que, cuando cambia de ninguna revisión de 50 en

+0

¿Qué estás preguntando exactamente? ¿Podría darnos un ejemplo de lo que está tratando de hacer? – Pedro

+0

acaba de agregar ejemplo lo que estoy buscando –

+0

¿Qué quieres decir con la exportación? ¿Desea un árbol de directorios con una copia de los archivos que cambiaron en cualquier revisión de 50 en adelante? – Matteo

Respuesta

10

Por lo que sé, svn no proporciona esa característica. Pero puede escribir un programa simple de C# usando SharpSVN para hacerlo. Aquí hay una muestra que puedes usar. En esta muestra, que estoy recibiendo el conjunto de archivos cambió de revisión de 100 a 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); 
     } 
    } 
} 
+0

creo su solución resolverá mis problemas, verificaré y publicaré –

0

Si entiendo su pregunta correctamente, una no estoy interesado en un parche global entre revisiones. En este caso, debe exportar cada revisión en un directorio separado, luego use una herramienta como Beyond Compare (o cualquier otra equivalente como WinMerge) para identificar los archivos modificados.

Pero, si su directorio de construcción está bajo control de versión, entonces sería mejor que creara un parche y lo aplicara en él.

+0

, por favor dame un ejemplo –

1

Aquí está una otra opción escrito en escritura del golpe:

#!/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] 

utilizo the complete scrip hacer una exportación svn incrementales en un entorno de producción LAMP.

4

Creé un archivo por lotes que funcionará para exportar los archivos modificados entre revisiones.

@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 
    ) 
) 

Para usarlo, simplemente especifica el rango de revisiones o revisión en la línea de comandos y un destino para los archivos exportados.

C:\YourRepository>svnexport.bat 1:10 C:\Export 
Cuestiones relacionadas