2009-01-15 10 views
21

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

मैं एक SVN के बाद प्रतिबद्ध हुक ताकि जब भी एक प्रतिबद्ध भंडार विकास साइट अद्यतन किया जाता है करने के लिए किया जाता है की स्थापना की है:

cd /home/www/dev_ssl 
/usr/bin/svn up 

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

तो पालन फ़ाइलें करने से:

  • /branches/feature_x/images/logo.jpg
  • /branches/feature_x/css/screen.css

यह निर्देशिका को अपडेट करेंगे :/शाखाओं/सुविधा_एक्स/

क्या कोई मुझे ऐसा समाधान बनाने में मदद कर सकता है जो इसे प्राप्त करता है?

अद्यतन:

  • भंडार और विकास साइट एक ही सर्वर पर स्थित हैं इसलिए नेटवर्क मुद्दे शामिल नहीं किया जाना चाहिए।
  • सीपीयू उपयोग बहुत कम है, और I/O ठीक होना चाहिए (यह हाय-स्पेक समर्पित सर्वर पर चल रहा है)
  • विकास साइट लगभग है। आकार में 7.5 जीबी और लगभग शामिल है। 600,000 आइटम, यह मुख्य रूप से कई शाखाओं/टैग होने

उत्तर

18

की वजह से है आप svnlook dirs-changed और svn up -N उपयोग कर सकते हैं केवल एक फ़ोल्डर की सामग्री को बदल अद्यतन करने के लिए:

cd /home/www/dev_ssl 
svnlook dirs-changed [REPOS] -r [REV] | xargs /usr/bin/svn up -N 

या, यदि प्रति -फाइल आपके लिए बेहतर हो सकता है (क्रिया वर्णों को पट्टी करने के लिए sed का उपयोग करके):

svnlook changed [REPOS] -r [REV] | sed "s/^....//" | xargs /usr/bin/svn up 
+0

मुझे sed समाधान पसंद है। लेकिन हम फ़ाइल नाम के पथ से पहले 4 वर्णों के बारे में कैसे सुनिश्चित कर सकते हैं? –

+1

@FelipeAlvarez कोई गारंटी नहीं है कि यह नहीं बदलेगा। लेकिन, अभी तक (1.8.0), यह [3 वर्ण] है (https://github.com/apache/subversion/blob/1.8.0/subversion/svnlook/svnlook.c#L568) और [एक स्थान] (https://github.com/apache/subversion/blob/1.8.0/subversion/svnlook/svnlook.c#L601), फिर पथ। –

1

विंडोज के लिए:

for /F "eol=¬ delims=¬" %%A in ('svnlook dirs-changed %1 -r %2') do svn export "file:///c:/path/to/repo/%%A" "c:/svn_exports/%%A" --force 

बस में ऊपर कॉपी अपने बाद के लिए प्रतिबद्ध हुक बैच फ़ाइल (या VisualSVN के लिए विंडो) और आपका काम हो - आप अद्यतन निर्देशिका ग को निर्यात कर देंगे: \

आप c:/path/to/repo के बजाय% 1 का उपयोग करने का प्रयास कर सकते हैं, लेकिन मैंने पाया कि यह काम नहीं करता है क्योंकि VisualSVN बैक-स्लैश पथ विभाजक के साथ% 1 पथ देता है, और svnlook उन्हें आगे-स्लैश के साथ देता है । यह ठीक से काम नहीं कर रहा है इसलिए मुझे रिपो पथ को हार्ड-कोड (मुझे मिला है "फ़ाइल नाम, निर्देशिका का नाम, या वॉल्यूम लेबल वाक्यविन्यास गलत है" त्रुटियां)

10
#!/bin/bash 

REPOS="$1" 
REV="$2" 

# A - Item added to repository 
# D - Item deleted from repository 
# U - File contents changed 
# _U - Properties of item changed; note the leading underscore 
# UU - File contents and properties changed 

# Files and directories can be distinguished, as directory paths are displayed with a trailing "/" character. 

LOOK=/usr/local/svn/bin/svnlook 
SVN=/usr/local/svn/bin/svn 
DEV=/var/www/test 

cd /var/tmp/svn 
    for changes in `$LOOK changed $REPOS | awk '{print $1 "=" $2;}'`; 
    do 
     len=${#changes} 
     idx=`expr index "$changes" =`; 
     directory=${changes:$idx}; 
     action=${changes:0:$idx-1}; 
     if [ ${changes:len-1} = '/' ] 
     then 
      case "$action" in 
       "A") \ 
        mkdir --mode=775 -p $DEV/$directory; 
        chown nobody:nobody $DEV/$directory; 
        chmod 775 $DEV/$directory; 
        ;; 
       "D") \ 
        rmdir $DEV/$directory; 
        ;; 
      esac 
     else 
      case "$action" in 
       "A"|"U"|"UU") \ 
        $SVN export --force --non-interactive -r HEAD -q file://$REPOS/$directory; 
        BASE=`basename $directory`; 
        DIR=`dirname $directory`; 
        chown nobody:nobody $BASE; 
        chmod 775 $BASE; 
        mkdir --mode=775 -p $DEV/$DIR; 
        cp -f --preserve=ownership $BASE $DEV/$DIR; 
        unlink $BASE; 
        ;; 
       "D") \ 
        rm -f $DEV/$directory; 
        ;; 
      esac 
     fi 
    done 

exit 0 
+0

धन्यवाद आईवो महान लिपि! – shady

संबंधित मुद्दे