كيف ترتكب في التخريب و إضافة الملفات/المجلدات و إزالة الملفات القديمة/المجلدات تلقائيا ؟
-
06-07-2019 - |
سؤال
بعد أن كان مدلل من قبل TortoiseSVN, أنا الآن باستخدام سطر الأوامر في لينكس للتفاعل مع SVN مستودع.
في TortoiseSVN وأود أن مجرد ارتكاب التغييرات ، فإنه تظهر لي قائمة من ما كان ما كان حذف ما تم تعديله.أنا سوف تحقق من كل المربعات وانقر طيب.
مع سطر الأوامر ، يبدو علي أن أفعل svn add
عندما أضيف الملفات svn rm
عند إزالة الملفات عند هذا كل ما فعلت, ثم اكتب svn commit
, وهي تلزم إضافتها ، إزالة تعديلها.
هناك أمر لا يمكن استخدام هذا فقط يرتكب الملفات/المجلدات لقد إزالة الملفات/المجلدات لقد أضاف والملفات لقد تعديلها دفعة واحدة ؟
المحلول
ومع الأدوات SVN القياسية، وليس هناك شيء من هذا القبيل - هو مذكور في لل التعليمات باعتبارها أمرا سيئا.
نصائح أخرى
وتحت Windows، فإن الملف الدفعي التالي العمل:
for /f "tokens=2*" %%i in ('svn status %1 ^| find "?"') do svn add "%%i"
for /f "tokens=2*" %%i in ('svn status %1 ^| find "!"') do svn delete "%%i"
svn commit -m "Automatic commit" %1
وببساطة حفظ خطوط الثلاثة المذكورة أعلاه في ملف يسمى 'autocommit.bat. إذا كنت تشغيلها من دليل العمل، لا تحتاج إلى تحديد معلمة. إذا كنت في دليل آخر، يمكنك أن نسميها مثل autocommit.bat c:\MyProjectFolder
.
وكان نادر Shirazie الأمر الصحيح في البرنامج النصي نشر . هنا في النسخة سطر واحد لينكس:
svn add $(svn st | sed -n 's/^[A?] *\(.*\)/\1/p')
وكنت أريد أن ظائف لفترة طويلة، وأنا سعيد لاني بحثت هنا!
وليس هناك قيادة SVN، ولكن أنا متأكد من أن هناك النصي أو اثنين يمكن أن تفحص لملفات غير معلومة الإصدار / المفقودة وإصدار الأوامر المناسبة ...
ولقد وجدت واحدة هنا: http://gael-varoquaux.info/computers/ svnautocommit / index.html و
وإضافة النص الكامل
#!/bin/bash
#------------------------------- Subroutines ---------------------------------
usage(){
echo " Usage: $(basename $0) PATH"
echo ""
echo "Automatically commits the changes of svn working copy located in PATH."
echo "The new files are automatically added and the files that have been removed"
echo "are removed."
echo ""
echo "By Gael Varoquaux"
}
#------------------------------- Process the options -------------------------
if [ $# -eq 1 ]
then
workingdir="$1"
else
usage
exit 1
fi
if ! cd $workingdir
then
echo $workingdir is not a accessible path.
usage
exit 1
fi
#------------------------------- Find out what has changed -------------------
# A warning if this fails :
echo "SVN autocommit failed" > $HOME/local/motd
svnstatus=$(svn status $workingdir)
added=$(printf "$svnstatus" | sed -n 's/^[A?] *\(.*\)/\1/p')
removed=$(printf "$svnstatus" | sed -n 's/^! *\(.*\)/\1/p')
if [ "x$added" != "x" ]
then
echo adding "$added" to repository
svn add $added
fi
if [ "x$removed" != "x" ]
then
echo removing "$removed" to repository
svn remove $removed
fi
svn commit -m "autocommit" && rm $HOME/local/motd
والنسخة بيثون يبدو أن لا يكون هناك سوء الحظ.
وأنت قد تحتاج إلى تعديل السيناريو لاتخاذ معلمة للتعليق عليه، لكنه بداية. يمكنك أيضا تعديله ليكون وسيلة سهلة للقيام إضافة / حذف بالنسبة لك، والقيام ارتكاب يدويا.
لإضافة:
svn status | grep "^\?" | sed -e 's/? *//' | sed -e 's/ /\\ /g' | xargs svn add
لإزالة:
svn status | grep "^\!" | sed -e 's/! *//' | sed -e 's/ /\\ /g' | xargs svn remove
وأنه يعمل بشكل جيد بالنسبة لي.
إذا كنت تريد أن تفعل ذلك مع بوويرشيل، وهنا هي وظيفة سهلة يستخدم svn status
:
svn status | ? { $_ -match '^\?\s+(.*)' } | % { svn add $Matches[1] }
والاعتمادات تذهب إلى جوابا على سؤال تجاوز المكدس <م> SVN الأمر لحذف جميع الملفات محليا م> مفقود >. أنا عدلت إلى عمله للملفات الجديدة.
وملف بوويرشيل I جعلها تبدو مثل هذا:
# Delete missing files
svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }
# Added new files
svn status | ? { $_ -match '^\?\s+(.*)' } | % { svn add $Matches[1] }
# Commit repository
svn commit -m "This commit is done by a PowerShell bat"
وباختصار، لا. لديك لsvn add
وsvn delete
كل بند.
إذا كنت غير مرتبطة SVN، تقدم بعض أنظمة أخرى تحكم مصدر هذه الميزة. على سبيل المثال، hg addremove
زئبقي ل.
وعلى الرغم أوامر مختصرة باستخدام وسائط سطر قوية، فإنها قد يغيب (أو تفشل) لتشمل أسماء بمسافات. الأمر التالي هو من جوابا ل سؤال مماثل التي سوف تشمل جميع الملفات.
svn add --force * --auto-props --parents --depth infinity -q
تلقائيا إضافة ملفات جديدة:
svn st | sed -rn '/^\?/s/^.{8}(.+)$/\1/p' | xargs -r svn add
تلقائيا إزالة الملفات المحذوفة:
svn st | sed -rn '/^!/s/^.{8}(.+)$/\1/p' | xargs -r svn rm
تفسير
هذا هو في الأساس نسخة مختصرة من لوكا الجواب الذي يجمع بين grep
واثنين sed
يدعو إلى واحد.
sed
-r
يستخدم تمديد التعبيرات العادية-n
لا يمر من خلال المدخلات- المرشحات خطوط بداية مع
?
أو!
(/^\?/
و/^!/
, على التوالي) ، - تخفيضات أول 8 أحرف (التي تحتوي على الأعلام) بعيدا:
s/^.{8}//
- طباعة بقية خط الانتاج:
s/(.+)$/\1/p
انظر أيضا: http://www.grymoire.com/Unix/sed.html
xargs
على -r
(أو --no-run-if-empty
) الخيار xargs
(جنو الإصدار) محطات المعالجة عندما لا يكون هناك مدخلات من sed
, وبالتالي القضاء على SVN خطأ Not enough arguments provided
.