كيفية تحديد وإزالة الالتزامات الثنائية الكبيرة داخل مستودع SVN؟

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

  •  24-09-2019
  •  | 
  •  

سؤال

أنا أعمل مع مستودع SVN عمره أكثر من 3 سنوات ويحتوي على أكثر من 6100 التزام ويبلغ حجمه أكثر من 1.5 جيجابايت.أريد تقليل حجم مستودع SVN (أنا لا أتحدث عن حجم تصدير SVN الكامل - أعني المستودع الكامل كما سيكون موجودًا على الخادم) قبل نقله إلى خادم جديد.

يحتوي المستودع الحالي على الكود المصدري لجميع مشاريعنا البرمجية ولكنه يحتوي أيضًا على ملفات ثنائية كبيرة نسبيًا ليس لها أي أهمية مثل:

  • أدوات التثبيت الكاملة لعدد من أدوات الطرف الثالث.
  • ملفات .jpg و.png (وهي عبارة عن عمليات تصدير غير معدلة لملفات PSD الموجودة في نفس المجلد).
  • مجلدات Bin وObj (والتي يتم بعد ذلك "تجاهل svn" في الالتزام التالي).
  • الدلائل ريشاربر.

تم "حذف SVN" لعدد من هذه الملفات الكبيرة منذ إضافتها، مما خلق مشكلة أخرى في تحديد أكبر المجرمين.

أريد إما:

  • قم بإنشاء مستودع SVN جديد يحتوي فقط على الكود الخاص بجميع مشاريع البرامج - إنه كذلك مهم للغاية أن الملفات المنسوخة تحتفظ بسجل SVN الخاص بها من المستودع القديم.
  • قم بإزالة الالتزامات والملفات الثنائية الكبيرة من المستودع الموجود.

هل أي من هذين ممكن؟

هل كانت مفيدة؟

المحلول

سيكون عليك استخدام Svnadmin تفريغ للحصول على ملف تفريغ لمستودعك الحالي وربما svndumpfilter لمعالجة ملف التفريغ. يمكنك أيضًا تعديل Dumpfile يدويًا طالما كنت حذراً.

ربما لن تكون مهمة سريعة وسهلة ، ولكن يمكن القيام بها. لقد فعلت شيئًا مشابهًا ، فقط لمستودع أصغر بكثير. كان لدي ريبو مع حوالي 150 مراجعة استغرقت حوالي 600 ميجابايت.

قم بعمل تفريغ من مستودعك الحالي ، وقم بإجراء التغييرات اللازمة وحاول تحميل Dumpfile المعدلة في مستودع جديد. ثم تحقق من المستودع الجديد للتأكد من أن كل شيء لا يزال منطقيًا (لا يزال التاريخ صحيحًا ، ولا توجد تغييرات غريبة في المسارات ، ...).

نصائح أخرى

الآخرون محق في svnadmin dump, ، إلخ svndumpfilter:

for r in `svn log -q | grep ^r | cut -d ' ' -f 1 | tr -d r`; do
   echo "revision $r is " `svn diff -c $r | wc -c` " bytes";
done

يمكنك أيضًا تجربة شيء مثل هذا للعثور على مراجعات أضافت ملفات بامتداد معين (هنا ، .jpg):

svn log -vq | egrep "^r|\.jpg$" | grep -B 1 "\.jpg$"

إذا قمت بحذف الملفات من المستودع باستخدام "حذف SVN"، فأنت لم تحذف الملفات فعليًا.سيكون هذا هو جمال SVN.بمجرد إضافة ملف إلى المستودع، فإنه يبقى هناك إلى الأبد (ما لم يتم استخدام التفريغ والتحميل).عند "حذف" الملفات، فإنك تقوم فعليًا بإنشاء مراجعة جديدة تشير إلى الحذف، لكن الملفات تظل موجودة في المراجعات السابقة.

لقد قمت ببعض عمليات التفريغ والتحميل، ولكن إلى مستودع أكبر بكثير.حوالي 60.000 (!!!) مراجعة.استغرق الأمر بعض الوقت، ولكن في النهاية، بعد التحميل الدقيق، تم بناء المستودع مرة أخرى.

طريقتك الوحيدة هي سرد ​​المراجعات التي تمت إضافة الملفات وتعديلها وحذفها.ثم قم بتفريغ المراجعات بينهما، وقم بتحميلها بالترتيب الصحيح.كن على علم، ليس هناك مجال للأخطاء.إذا قمت بخطأ ما، فسيتعين عليك البدء من جديد.تفريغ وتحميل من البداية.

اقتراحي، إذا كانت الملفات الكبيرة تمثل مشكلة، ففكر في إنشاء مستودع جديد بدون سجل.احتفظ بالنسخة القديمة لمقارنة التاريخ، وابدأ العمل من جديد.

حظ سعيد.

إذا كنت بحاجة فقط إلى العثور على ارتباطات مخالفة و يمكنك الوصول إلى الخادم الذي يستضيف المستودع: ابحث عن ملفات كبيرة في دليل DB/Revs للمستودع (على افتراض أنه يستخدم تنسيق FSFS).

أليس هذه مجرد مشكلة مختلفة ، مع خطوة إضافية؟ أي أنك تحتاج إلى تحديد موقع الملفات التي تعتبرها كبيرة وثنائيًا ، ثم تحقق مما إذا كانت تدار بالفعل بواسطة SVN أو تم بناؤها محليًا (أو تم استيرادها من نظام الأصول المتوازي ، إذا كان موجودًا بالفعل).

لذلك ، فقط ابحث عن الملفات ، ثم افعل svn info عليهم لمعرفة ما إذا كانوا جزءًا من المستودع.

مجرد فكرة صغيرة ، أنت تقول أن الحالة الحالية للمستودع (الرأس الحالي) جيد ، أي أن الملفات الثنائية الكبيرة قد تم حذفها في الماضي. لذلك مشكلتك هي بحتة حجم المستودع؟

أعلم أنك قلت إنك ترغب في الحفاظ على كل تاريخ الالتزام ، ولكن كخيار ، يمكنك القيام بمكبرتين ، أحدهما لتاريخ المراجعة بأكمله ، وواحد للمراجعة الحالية.

إذا وضعت التفريغ الكامل على قرص DVD على سبيل المثال ، فستتوفر للبيانات إذا كنت بحاجة إليها من أي وقت مضى ، ولكن يمكنك بعد ذلك حذف المستودع بالكامل وتحميل SVN تفريغ المراجعة ، مما يتركك مع مستودع نظيف صغير.

من الممكن أيضًا التخلص من مراجعة محددة فصاعدًا ، بدلاً من الرأس فقط ، لذلك على سبيل المثال ، يمكنك الاحتفاظ بالأشهر الثلاثة الأخيرة من المراجعات وتفريغ كل شيء أقدم إلى قرص DVD ....

التفصيل عن إجابة الآخرين ، إليك ما عملت على وجه التحديد بالنسبة لي:

svnadmin create new-repo
svnadmin dump old-repo | svndumpfilter exclude --pattern '*.exe' '*.jpg' '*.png' | svnadmin load new-repo

قد تكون قادرًا على استبعاد الخاص بك Obj و Bin الدلائل بإضافتها إلى svndumpfilter الأمر - لم أحاول ذلك.

أيضا ، التخريب fsfs-stats البرنامج (جديد في Subversion 1.8 ، تم استبداله بـ 1.9 svnfsfs stats) قد تكون مفيدة لقياس أنواع الملفات والملفات المحددة التي تملأ مستودعك.

قد يكون هذا مفيدًا لمقارنة المستودعات بعد ذلك:

colordiff -u <(svn log -v file:///.../old-repo ) <(svn log -v file:///.../new-repo)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top