2009-01-15 35 views
21

Tôi đang sử dụng kho lưu trữ SVN cho công việc phát triển web của mình. Tôi có một trang web phát triển được thiết lập có chứa một thanh toán của kho lưu trữ.Sử dụng móc hậu cần SVN để chỉ cập nhật các tệp đã được cam kết

tôi đã thiết lập một SVN sau cam kết nối để bất cứ khi nào một cam kết được thực hiện cho các kho lưu trữ các trang web phát triển được cập nhật:

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

này hoạt động tốt nhưng do kích thước của kho lưu trữ các bản cập nhật mất một thời gian dài (khoảng 3 phút) mà là khá bực bội khi thực hiện cam kết thường xuyên. Những gì tôi muốn là thay đổi hook sau cam kết chỉ cập nhật những tập tin/thư mục đã được cam kết nhưng tôi không biết làm thế nào để đi về việc này. Cập nhật "thư mục chung thấp nhất" có thể là giải pháp tốt nhất, ví dụ:

Nếu cam kết các tập tin sau:

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

Nó sẽ cập nhật các thư mục :/branches/feature_x/

Có ai có thể giúp tôi tạo giải pháp đạt được điều này không?

Cập nhật:

  • Các kho và trang web phát triển nằm trên cùng một máy chủ để các vấn đề mạng không nên tham gia.
  • Mức sử dụng CPU rất thấp và I/O phải ổn (máy đang chạy trên máy chủ chuyên dụng hi-spec)
  • Trang web phát triển là xấp xỉ. Kích thước 7,5 GB và chứa xấp xỉ. 600.000 mục, điều này chủ yếu là do có nhiều chi nhánh/thẻ

Trả lời

18

Bạn có thể sử dụng svnlook dirs-changedsvn up -N để cập nhật chỉ các nội dung của mỗi thư mục thay đổi:

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

Hoặc, nếu mỗi -file có thể tốt hơn cho bạn (sử dụng sed để tách các ký tự hành động):

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

tôi thích giải pháp an toàn. Nhưng làm thế nào chúng ta có thể chắc chắn của 4 ký tự trước khi đường dẫn đến tên tập tin? –

+1

@FelipeAlvarez Không bảo đảm nó sẽ không thay đổi. Nhưng, hiện tại (1.8.0), đó là [3 ký tự] (https://github.com/apache/subversion/blob/1.8.0/subversion/svnlook/svnlook.c#L568) và [khoảng trắng] (https://github.com/apache/subversion/blob/1.8.0/subversion/svnlook/svnlook.c#L601), sau đó là đường dẫn. –

1

Đối với Windows:

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 

Chỉ cần copy ở trên vào bạn post-commit batch file móc (hoặc cửa sổ cho VisualSVN) và bạn đã hoàn tất - bạn sẽ nhận được các thư mục được cập nhật xuất khẩu sang c: \

Bạn có thể thử sử dụng% 1 thay vì c:/path/to/repo ở trên, nhưng tôi thấy rằng nó không hoạt động vì VisualSVN cung cấp đường dẫn% 1 với dấu phân tách đường chéo, và svnlook cho chúng với các dấu gạch chéo . Điều này dường như không hoạt động đúng cách để tôi mã hóa đường dẫn repo (tôi nhận được "Tên tệp, tên thư mục hoặc cú pháp nhãn khối không chính xác")

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

Cảm ơn kịch bản tuyệt vời của Ivo! – shady

Các vấn đề liên quan