Soru Yalnızca işlenen dosyaları güncellemek için SVN post-commit hook'u kullanma


Web geliştirme çalışmalarım için SVN deposu kullanıyorum. Deponun bir çıkışını tutan bir geliştirme sitem var.

Bir SVN post-commit hook kurdum, böylece depoya bir taahhüt yapıldığında geliştirme sitesi güncellenir:

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

Bu iyi çalışır ancak depo büyüklüğü nedeniyle güncelleştirmeler uzun süre (yaklaşık 3 dakika) alır, bu da düzenli işlemler yaparken oldukça sinir bozucu olur. İstediğim şey, post-commit hook'unu yalnızca, işlenmiş olan dosyaları / dizinleri güncellemek için değiştirmektir, ancak bunu nasıl yapacağımı bilmiyorum. "En düşük ortak dizin" güncellenmesi muhtemelen en iyi çözüm olabilir, örn.

Takip eden dosyalar işlenirse:

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

Dizini günceller: / branch / feature_x /

Bunu başarabilecek bir çözüm üretmeme yardım eden var mı?

Güncelleştirme:

  • Depo ve geliştirme sitesi aynı sunucuda bulunur, bu nedenle ağ sorunları dahil edilmemelidir.
  • CPU kullanımı çok düşüktür ve G / Ç tamam olmalıdır (o, özel özellikli sunucuda çalışır)
  • Geliştirme alanı yaklaşık. 7,5GB boyutunda ve yaklaşık içerir. 600.000 ürün, bunun başlıca nedeni çoklu dallara / etiketlere sahip olmasıdır

21
2018-01-15 12:15


Menşei




Cevaplar:


Kullanabilirsiniz svnlook dirs-changed ve svn up -N Yalnızca her bir klasörün içeriğini güncellemek için:

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

Ya da dosya başına sizin için daha uygun olabilirse sed eylem karakterlerini şeritlemek için):

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

18
2018-01-15 12:36



sed çözeltisini severim. Ancak dosya adından önce 4 karakterden nasıl emin olabiliriz? - Felipe Alvarez
@FelipeAlvarez Değiştirmeyecek hiçbir garanti yoktur. Ancak, şu an itibariyle (1.8.0), 3 karakter ve bir boşluko zaman yol. - Jonathan Lonowski


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

11
2017-07-30 17:05



Teşekkürler Ivo harika senaryo! - shady


Pencereler için:

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

Sadece yukarıdaki post-commit kanca toplu iş dosyasına (veya VisualSVN için pencere) kopyalayın ve bitti - güncellenen dizin c: \ ihraç edilir

Yukarıda c: / path / to / repo yerine% 1 kullanmayı deneyebilirsiniz, ancak VisualSVN% 1 yolunu eğik çizgi ayırıcıları ile verdiğinden ve svnlook bunları ileri eğik çizgilerle verdiğinden işe yaramadığını fark ettim. Bu doğru çalışma gibi görünmüyor, bu yüzden repo yolunu sabit olarak kodluyorum ("Dosya adı, dizin adı veya birim etiketi sözdizimi yanlış" hata var)


1
2018-02-09 18:17





Bu ev yapımı senaryoya bir göz atın: http://envrac.blogdns.net/shellscripts/export-automatique-d-un-projet-subversio !


0
2017-09-25 11:56