2011-09-07 12 views
6

मैं दो संशोधनों के बीच परिवर्तित एसवीएन में परिवर्तित फ़ाइलों को कैसे निर्यात कर सकता हूं। मुझे कमांड लाइन के माध्यम से या किसी भी स्क्रिप्ट का उपयोग करके समाधान की आवश्यकता है (उचित फ़ोल्डर संरचना के साथ)। इसके अलावा, मुझे विंडोज आधारित समाधान की आवश्यकता है।दो एसवीएन संशोधनों के बीच बदली गई फ़ाइलों को निर्यात करने के लिए कैसे करें

उदा। sth की तरह:

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

मुझे लगता है कि जहां

+0

आप वास्तव में क्या पूछ रहे हैं? क्या आप इसका उदाहरण दे सकते हैं कि आप क्या करने की कोशिश कर रहे हैं? – Pedro

+0

बस जोड़ा गया उदाहरण मैं क्या देख रहा हूं –

+0

निर्यात के साथ आपका क्या मतलब है? क्या आप एक निर्देशिका पेड़ चाहते हैं जिसमें फाइलों की प्रतिलिपि है, जहां 50 से किसी भी संशोधन में बदला गया है? – Matteo

उत्तर

10

जहाँ तक मुझे पता है, svn ऐसी सुविधा प्रदान नहीं करता है। लेकिन आप इसे करने के लिए SharpSVN का उपयोग कर एक सरल सी # प्रोग्राम लिख सकते हैं। यहां एक नमूना है जिसका आप उपयोग कर सकते हैं। इस नमूने में, मैं पूरी हो रही है 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

मुझे लगता है आपका समाधान मेरे मुद्दों को हल करेगा, मैं जांच और पोस्ट करूंगा –

11

यहाँ पर 50 से किसी भी संशोधन में बदल फ़ाइलों की एक प्रतिलिपि के साथ एक निर्देशिका वृक्ष चाहते कदम ट्यूटोरियल द्वारा एक बड़ा कदम है जो TortoiseSVN के संशोधनों की तुलना के साथ ऐसा है और निर्यात चयन करने के लिए ... कार्य:

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

+1

पर 50 से किसी भी संशोधन में बदला गया है, मुझे पहले से ही पता है, लेकिन मुझे स्क्रिप्टिंग उद्देश्य –

0

अगर मैं आपके सवाल का ठीक से, आप एक को समझने संशोधन के बीच एक वैश्विक पैच में रुचि नहीं है। इस मामले में, आपको प्रत्येक संशोधन को एक अलग निर्देशिका में निर्यात करने की आवश्यकता है, फिर संशोधित फ़ाइलों की पहचान करने के लिए तुलना करें (या WinMerge जैसा समकक्ष कुछ भी) जैसे टूल का उपयोग करें।

लेकिन, यदि आपकी बिल्ड निर्देशिका संस्करण नियंत्रण में है, तो आप एक पैच बनाने और इसे लागू करने से बेहतर होंगे।

+0

के लिए कमांड लाइन समाधान चाहिए, कृपया मुझे एक उदाहरण दें –

1

यहाँ करने के लिए संशोधन 100 से फ़ाइल बदल बैश लिपि में लिखी एक अन्य विकल्प है:

#!/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 निर्यात करने के लिए एक एलएएमपी उत्पादन पर्यावरण पर।

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 
संबंधित मुद्दे