2011-09-07 45 views
6

我怎樣才能導出SVN改變文件有兩個版本有所改變之間。我需要通過命令行或使用任何腳本(具有適當的文件夾結構)的解決方案。另外,我需要基於Windows的解決方案。如何更改的文件出口2個SVN版本

例如某事像:

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

我想用文件的副本的目錄樹凡在任何版本上

+0

究竟什麼是你問?你能提供一個你想要做什麼的例子嗎? – Pedro

+0

剛剛添加的例子我在找什麼 –

+0

你是什麼意思出口?你是否想要一個目錄樹,其中包含從50開始修改版本的文件副本? – Matteo

回答

10

據我所知,SVN沒有提供這樣的功能。但是你可以使用SharpSVN來編寫一個簡單的c#程序來完成它。以下是您可以使用的示例。在此示例中,我得到了整個從版本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); 
     } 
    } 
} 
+0

我認爲你的解決方案將解決我的問題,我會檢查和發佈 –

0

如果我正確的,你明白你的問題對修訂版之間的全球補丁不感興趣。在這種情況下,您需要將每個修訂版導出到單獨的目錄中,然後使用Beyond Compare之類的工具(或與WinMerge等效的任何東西)來識別修改後的文件。

但是,如果你的build目錄是版本控制之下,那麼你會過得更好創建一個補丁,並將其應用就可以了。

+0

命令行的解決方案可以請你給我一個例子 –

1

這裏是寫在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] 

我用the complete scrip做增量SVN出口在LAMP生產環境中。

4

我創建一個批處理文件,將工作導出版本之間更改的文件。

@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