للعثور على أكبر الملفات المخزنة في سجل Git الذي يمكن الوصول إليه في مستودع ما على نظام macOS، افتح Terminal، وانتقل إلى المستودع، وقم بتمرير قائمة كائنات Git عبر git cat-file وsort. يعرض هذا الحجم غير المضغوط لكل كائن ثنائي كبير (blob) بالبايت وتلميحاً للمسار. يمكن أن يكشف ذلك عن الملفات التي تم حذفها أو استبدالها ولكنها لا تزال موجودة في التغييرات المعتمدة (commits) التي يمكن الوصول إليها من الفروع أو العلامات (tags).

تشغيل فحص السجل من Terminal

في Terminal، استخدم cd للدخول إلى المستودع. ضع مسار المجلد بين علامتي اقتباس إذا كان يحتوي على مسافات. ثم شغّل:

git rev-list --objects --all |
  git cat-file --batch-check='%(objecttype) %(objectsize) %(objectname) %(rest)' |
  awk '$1 == "blob"' |
  sort -k2,2nr |
  head -20

يتم فرز المخرجات من الأكبر إلى الأصغر. يعرض كل صف نوع الكائن، وعدد البايتات، ومعرّف الكائن، وتلميحاً للمسار عندما يوفره Git. يتنقل الأمر git rev-list --objects --all عبر الكائنات التي تشير إليها التغييرات المعتمدة والتي يمكن الوصول إليها من المراجع (refs)، مثل الفروع المحلية والعلامات؛ بينما يبلغ git cat-file --batch-check عن نوع كل كائن وحجمه. يقوم مسار التمرير (pipeline) بفلترة كائنات blob فقط، وهي الكائنات التي تحتوي على محتويات الملفات. توثّق وثائق rev-list الخاصة بـ Git التنقل بين الكائنات وأسماءها، كما توثّق cat-file مخرجات الحجم والنوع على دفعات.

يستخدم sort -k2,2nr أداة sort المدمجة في macOS للترتيب رقمياً وتنازلياً وفقاً للحقل الثاني المفصول بمسافة بيضاء، وهو الحجم بالبايت. يحدد head -20 العرض بـ 20 صفاً؛ قم بتغيير الرقم أو إزالة هذا السطر الأخير لرؤية المزيد. يقرأ الأمر بيانات المستودع فقط، ولا يعدّل التغييرات المعتمدة (commits) أو الملفات.

تفسير النتائج بعناية

يحدد كل صف كائن blob، وليس بالضرورة ملفاً موجوداً حالياً في شجرة العمل (working tree). يمكن أن يأتي الكائن الكبير من إصدار قديم لملف ما، وتلميح المسار ليس فهرساً كاملاً للمسار التاريخي: يوضح Git أنه مع استخدام --objects، تكون الأسماء مجرد تلميحات، وقد يتم تعديلها بسبب الأسطر الجديدة، وعندما يكون للكائن أسماء متعددة، قد يتم عرض اسم واحد فقط. تعامل مع المسار المدرج كدليل، ثم افحص التغييرات المعتمدة ذات الصلة لتأكيد متى وأين ظهر المحتوى. تشرح ملاحظات أسماء كائنات rev-list في Git هذه القيود.

يغطي هذا الفحص الكائنات التي يمكن الوصول إليها من المراجع المكتشفة بواسطة --all، وليس كل كائن قد يظل موجوداً فعلياً في قاعدة بيانات الكائنات. للتحقق من تخزين الكائنات المحلي، بما في ذلك الكائنات التي لا يمكن الوصول إليها، شغّل:

git cat-file --batch-all-objects \
  --batch-check='%(objecttype) %(objectsize) %(objectname)' |
  awk '$1 == "blob"' |
  sort -k2,2nr |
  head -20

يمر الأمر --batch-all-objects على جميع الكائنات الموجودة في المستودع ومخازن الكائنات البديلة، بما في ذلك الكائنات التي لا يمكن الوصول إليها من المراجع. يحذف هذا الأمر الثاني مسارات الملفات، لذا استخدم معرّف الكائن لإجراء مزيد من التحقق. تشير وثائق cat-file إلى كل من التغطية الأوسع للكائنات وحقيقة أنه يتم عرض كل كائن مرة واحدة حتى لو تم تخزينه عدة مرات.

حجم كائن Blob ليس مطابقاً للمساحة المستهلكة على القرص

يمثل objectsize المسجل الحجم غير المضغوط لكائن Git. قد يقوم Git بضغط الكائنات أو تخزينها كفروقات (deltas) داخل ملفات الحزم (packfiles)، لذا فإن كائن blob الكبير لا يستهلك بالضرورة ذلك المقدار الدقيق من مساحة القرص. للحصول على نظرة عامة على استخدام التخزين، شغّل git count-objects -vH؛ يوضح حقل size-pack فيه حجم البيانات المضغوطة وتلخص حقوله الأخرى الكائنات المفككة (loose objects) ومساحة التخزين ذات الصلة. يوثّق دليل count-objects الخاص بـ Git هذه الأرقام. لفحص أحجام الكائنات المجمعة وتفاصيل الفروقات (deltas)، يسرد git verify-pack -v حجم كل كائن مجمع وحجمه داخل ملف الحزمة، ولكنه يتطلب ملف .idx المعني. يحدد دليل verify-pack تلك المخرجات.

إذا عثرت على ملف تاريخي كبير

حدد أولاً ما إذا كانت مهمتك هي فهم النسخة الحالية المستخرجة (current checkout) أم تقليص سجل المستودع. بالنسبة للإصدار الحالي فقط، افحص الملفات في Finder أو استخدم قائمة أحجام الملفات في Terminal؛ أما فحص السجل فيجيب على سؤال مختلف من خلال البحث في كائنات Git التي يمكن الوصول إليها.

إذا كان ينبغي إزالة ملف كبير من كل مراجعة (revision)، فإن حذفه في تثبيت تغييرات (commit) جديد وحده لا يمحو النسخ القديمة من السجل. تؤدي إعادة كتابة السجل إلى تغيير معرّفات التثبيت (commit IDs) وتؤثر على الأشخاص الآخرين الذين يستخدمون المستودع، لذا قم بالتنسيق قبل القيام بذلك واحتفظ بنسخة احتياطية. يوفر مشروع git-filter-repo وضع تحليل للقراءة فقط، git filter-repo --analyze، والذي ينشئ تقارير للمساعدة في تحديد ما يجب تصفيته؛ ولا يقوم بإعادة الكتابة في وضع التحليل. تصف وثائق المشروع خيار التحليل وتحذر من أن التصفية تعيد كتابة السجل.

يعد مسار التمرير (pipeline) الأول نقطة بداية عملية عندما يكون الهدف هو العثور على أكبر محتويات الملفات عبر سجل المستودع المحلي. استخدم فحص جميع الكائنات عندما تكون البقايا التي لا يمكن الوصول إليها مهمة، وقارن أحجام كائنات Git مع مساحة تخزين الحزم (pack storage) قبل عزو استهلاك مساحة القرص إلى كائن blob معين.

المصادر