صيانة المستودع
لا يخبرك git أبدًا بما يكلّفه المستودع. فهو يواصل العمل مهما كانت حالة قاعدة بيانات كائناته، ولذلك تكون أول علامة على المشكلة عادةً استنساخًا يزحف أو حاسوبًا لم تبقَ فيه مساحة — بعد وقت طويل من اللحظة التي كان أمر واحد فيها كافيًا لإصلاح الأمر.
هذه اللوحة هي القراءة الغائبة: أين ذهبت المساحة، وكم منها قابل للاسترداد، وما الذي تفعله كل مهمة قبل أن تشغّلها.
⌘K ← صيانة المستودع.

قراءة الأرقام
كل شيء يأتي من git count-objects -v ومن جولة وصول حقيقية — لا شيء مقدَّر
بالتخمين.
| الصف | ما هو | لماذا ينمو |
|---|---|---|
| محزوم | كائنات داخل ملفات الحزم، مضغوطة ومخزَّنة بالفروق | هذه هي الحالة الصحية |
| سائب | ملف لكل كائن، بضغط ضئيل | كل التزام وكل جلب يكتب من هذه |
| غير قابل للوصول | كائنات لم يعد يشير إليها شيء | التزامات مهملة، ورسائل معدَّلة، وإعادات أساس متروكة |
العدد المجاور لـ سائب — «n كائنًا، منها m محزومة أصلًا» — هو ما يستحق
المراقبة. تلك الـ m مخزَّنة مرتين: مرة سائبة ومرة داخل حزمة. إنها تكرار خالص،
وgit gc هو ما يطويها.
غير القابل للوصول ليس نفايةً بعد. تلك الكائنات هي ما يجعل git reflog قادرًا
على إعادة التزام أعدت ضبطه بعيدًا. يحتفظ بها git أسبوعين عن قصد.
المهام
| الزر | يشغّل | التكلفة |
|---|---|---|
| تحسين | git gc |
ثوانٍ إلى دقيقة. وهو الجواب الصحيح في معظم الأحيان |
| إعادة الحزم من الصفر | git gc --aggressive |
دقائق على مستودع كبير. يعيد حساب كل فرق |
| إعادة بناء رسم الالتزامات | git commit-graph write --reachable |
سريع. يجعل جولات السجل والرسم البياني أسرع بوضوح |
| فحص السلامة | git fsck --dangling |
بطيء على مستودع كبير، ولا يغيّر شيئًا |
| إسقاط غير القابل للوصول الآن | git gc --prune=now |
يدمّر شبكة أمان سجل المراجع |
تحسين هو ما ينبغي أن تمدّ يدك إليه. يحزم الكائنات السائبة، ويسقط ما ظلّ غير قابل للوصول أكثر من أسبوعين، ويترك السجل الحديث قابلًا للاستعادة.
إعادة الحزم من الصفر مبالغ في تسويقها. فهي ترمي كل فرق قائم وتعيد الحساب من لا شيء، وهو ما يستغرق دقائق ويوفّر عادةً نسبة قليلة فوق ما يوفّره gc العادي. تستحق التنفيذ مرة واحدة بعد استيراد سجل ضخم؛ ولا تستحقه بشكل روتيني.
إسقاط غير القابل للوصول الآن يسأل أولًا، ويقول التأكيد كم عدد الكائنات وكم المساحة. وبعده، يصبح التزام أعدت ضبطه بعيدًا قبل ساعة غير قابل للاستعادة — قد يبقى مدخل سجل المراجع مسرودًا، لكن الكائن الذي وراءه قد اختفى.
فحص السلامة
يتحقق git fsck من أن كل كائن يشير إليه كائن آخر موجود فعلًا ومتّسق داخليًا.
- الكائنات المتدلّية أمر طبيعي. إنها الكائنات غير القابلة للوصول، مسرودة بالاسم. والمستودع الذي فيه مئات منها بعد إعادة أساس مستودع سليم.
- الكائنات المفقودة ضرر — كتابة مبتورة، أو قرص معطوب، أو نقل مقطوع. إن ظهر أي منها فلا تعد الحزم: إعادة حزم قاعدة بيانات متضررة قد تحوّل مشكلة قابلة للاسترجاع إلى مشكلة دائمة. استنسخ نسخة سليمة من مستودعك البعيد وانقل فروعك غير المرسَلة إليها عبر حزمة.
الصيانة في الخلفية
يسجّل مربع الاختيار المستودع لدى git maintenance، الذي يحزم ويجلب مسبقًا وفق
جدول يشغّله نظام تشغيلك (launchd أو systemd أو Task Scheduler).
لا شيء هنا خاص بـ Gitcito: الجدول نفسه يخدم طرفيتك، وgit maintenance unregister
يلغيه من أي مكان. وإلغاء تحديد المربع يفعل ذلك بالضبط، ويترك الجدول قائمًا لأي
مستودعات أخرى مسجَّلة.
حدود يجدر معرفتها
- عدّ غير القابل للوصول يتطلّب جولة وصول كاملة، لذا يستغرق فتح اللوحة على مستودع ضخم جدًا لحظة. وذلك هو الرقم الصادق، لا تقدير.
- الأحجام هي ما يتخلّى عنه القرص، لا طول المحتوى. الكائن السائب بحجم 400 بايت يشغل مع ذلك كتلة بحجم 4 كيلوبايت، ولهذا يكلّف ألف منها ميغابايتات — ولهذا يستحق حزمها العناء.
- لشجرة العمل أو الوحدة الفرعية مجلد
.gitخاص بها، لذا فالحجم المعروض هو حجم هذا المستودع وحده. - الصيانة لا تستطيع تقليص السجل. إن كان كائن بحجم 400 ميغابايت داخل التزام، فهو قابل للوصول، وسيبقيه gc إلى الأبد — وذلك هو إزالة ملف من السجل، وهي عملية مختلفة وأشدّ اضطرابًا بكثير.
- لا يشغّل Gitcito أبدًا gc من وراء ظهرك. أما
gc --autoالخاص بـ git فقد يفعل، كما فعل دائمًا؛ وإن فشل ترك ملاحظة في.git/gc.log، وهي ما تُظهره هذه اللوحة.
انظر أيضًا: إزالة ملف من السجل · الحزم والأرشيفات · الاستعادة