استخدام ربط SVN post-commit لتحديث الملفات التي تم الالتزام بها فقط
-
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 !