استخدام ربط SVN post-commit لتحديث الملفات التي تم الالتزام بها فقط

StackOverflow https://stackoverflow.com/questions/446518

  •  22-07-2019
  •  | 
  •  

سؤال

أنا أستخدم مستودع SVN لأعمال تطوير الويب الخاصة بي.لقد قمت بإعداد موقع تطوير والذي يتضمن تسجيل الخروج من المستودع.

لقد قمت بإعداد ربط SVN لما بعد الالتزام بحيث يتم تحديث موقع التطوير كلما تم الالتزام بالمستودع:

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

يعمل هذا بشكل جيد ولكن نظرًا لحجم المستودع، تستغرق التحديثات وقتًا طويلاً (حوالي 100 دقيقة).3 دقائق) وهو أمر محبط إلى حد ما عند القيام بالتزامات منتظمة.ما أرغب فيه هو تغيير رابط ما بعد الالتزام لتحديث تلك الملفات/الأدلة التي تم الالتزام بها فقط ولكني لا أعرف كيفية القيام بذلك.ربما يكون تحديث "الدليل المشترك الأدنى" هو الحل الأفضل، على سبيل المثال.

في حالة ارتكاب الملفات التالية:

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

سيتم تحديث الدليل:/الفروع/feature_x/

هل يمكن لأي شخص مساعدتي في إيجاد حل يحقق ذلك؟

تحديث:

  • يقع المستودع وموقع التطوير على نفس الخادم لذا لا ينبغي أن تكون هناك مشكلات في الشبكة.
  • استخدام وحدة المعالجة المركزية منخفض جدًا، ويجب أن يكون الإدخال/الإخراج على ما يرام (يتم تشغيله على خادم مخصص عالي المواصفات)
  • موقع التطوير تقريبًا.حجمه 7.5 جيجا ويحتوي على حوالي .600000 عنصر، ويرجع ذلك أساسًا إلى وجود فروع/علامات متعددة
هل كانت مفيدة؟

المحلول

قد تستخدم 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

نصائح أخرى

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

للنوافذ:

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:\

يمكنك محاولة استخدام %1 بدلاً من c:/path/to/repo أعلاه، لكنني وجدت أنه لا يعمل لأن VisualSVN يعطي المسار %1 بفواصل مسار الشرطة المائلة الخلفية، بينما يوفرها svnlook بخطوط مائلة للأمام.يبدو أن هذا لا يعمل بشكل صحيح لذا قمت بترميز مسار الريبو (لقد حصلت على أخطاء "اسم الملف أو اسم الدليل أو بناء جملة تسمية وحدة التخزين غير صحيح")

ألق نظرة على هذا البرنامج النصي المصنوع منزليًا: http://envrac.blogdns.net/shellscripts/export-automatique-d-un-projet-subversio !

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top