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

التطعيم
| تعطيه | فتحصل على |
|---|---|
| التزامًا، بلا آباء | يصير ذلك الالتزام بداية السجل |
| التزامًا، وأبًا واحدًا أو أكثر | يتصل هناك بدلًا من موضعه الحقيقي |
الصيغة الثانية هي المثيرة للاهتمام. احتفظ بالسجل كاملًا في مستودع أرشيف، وابتر المستودع العامل، ثم تطعيم يشير إلى طرف الأرشيف يعيد وصل الاثنين — وهي الحيلة نفسها التي يستخدمها GitHub ليقدّم استنساخًا ضحلًا يمكن تعميقه لاحقًا.
التطعيم بلا آباء يسأل أولًا، لأن «السجل ذهب» و«السجل مخفي» يبدوان متطابقين من
السجل، وليسا الشيء نفسه إطلاقًا. فالكائنات تبقى حية حتى يقلّمها gc؛ انظر
الصيانة.
التعايش معه
الاستبدالات مراجع، تحت refs/replace/. ولذلك ثلاث نتائج تستحق أن تُعرف:
- هي محلية حتى تُرسَل:
git push origin "refs/replace/*"يشاركها، ومن يستنسخ من دونها يرى السجل غير الممسوس. - التراجع يعمل — فإسقاط المرجع يعيد النسب الحقيقي فورًا، ويسجّل Gitcito التطعيم بوصفه إجراءً قابلًا للتراجع كأي إجراء آخر.
core.useReplaceRefs=falseيجعل git يتجاهلها كلها دفعة واحدة. والمفتاح هنا يكتب ذلك بالضبط، وتقول النافذة ذلك حين يكون مطفأً، لأن مستودعًا يتجاهل استبدالاته في صمت مكان مربك.
ومن سطر الأوامر، يعرض git --no-replace-objects log السجل الحقيقي دون تغيير أي
إعداد.
متى تلجأ إلى هذا بدلًا من إعادة الكتابة
| الهدف | الأداة |
|---|---|
| الاستنساخ ضخم أكثر من اللازم، والسجل بخير | التطعيم — لا شيء يُعاد كتابته، وقابل للعكس |
| سرّ أو كائن ضخم لا بد أن يزول | إزالة ملف من السجل — إعادة كتابة حقيقية |
| تريد فقط تنزيلًا أقل مرة واحدة | git clone --depth — ضحل، وبلا مراجع تديرها |
التطعيم لا يزيل شيئًا. فإن كان سبب رغبتك في إخراج الالتزامات القديمة أنها تحوي شيئًا ما كان ينبغي أن يُلتزم به أصلًا، فهذه هي الصفحة الخطأ: الكائنات لا تزال هناك، ولا تزال قابلة للجلب ببصمتها، ولا تزال في كل استنساخ قائم.
حدود تستحق أن تُعرف
- ما تراه يتوقف عن مطابقة ما هو مخزَّن. وهذه هي الميزة، وهي الخطر. فمن يصحّح خللًا في استنساخ فيه استبدالات يحتاج إلى معرفة أنها موجودة.
- الاستبدالات لا تسافر افتراضيًا، ولذلك قد يختلف
git logعند زميلك عن الذي عندك اختلافًا مشروعًا. - الاستبدال يستطيع أن يخفي التزامًا عن الأدوات، لا عن git. فـ
git cat-fileومستكشف الكائنات لا يزالان يفتحان الأصل ببصمته. - لا يقدّم Gitcito الأمر
git replace --edit(إعادة كتابة محتوى كائن باليد). فتلك مهمة محرر نصوص على كائن خام، ومزلق يطلق النار على قدمك إن وُضعت حوله واجهة.
انظر أيضًا: مستكشف الكائنات · إزالة ملف من السجل · صيانة المستودع