إذا استمر Git في إدراج ملف بالرغم من مطابقته لـ .gitignore، فقم بإزالته من فهرس Git مع ترك النسخة المحلية في مكانها. في Terminal، انتقل إلى المستودع، وشغّل git rm --cached -- "path/to/file"، ثم قم بعمل commit لعملية الإزالة المرحلية هذه وقاعدة التجاهل. تؤكد وثائق Git أن قواعد التجاهل تؤثر على الملفات غير المتتبعة؛ وهي لا توقف تتبع الملفات الموجودة بالفعل في الفهرس. (وثائق Git gitignore)

لماذا لم يوقف .gitignore تتبع الملف

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

على Mac، افتح تطبيق Terminal وانتقل إلى المجلد ذي المستوى الأعلى في المستودع. توثق Apple تطبيق Terminal كواجهة لسطر الأوامر في macOS وتحدد zsh كغلاف افتراضي؛ وتعمل الأوامر أدناه في إعداد zsh المعتاد. تأكد من أنك في المستودع الصحيح قبل تغيير الفهرس الخاص به:

git status

مسار الملف في الأمر التالي نسبي بالنسبة لجذر المستودع. استبدل المثال بالمسار الفعلي. احتفظ بعلامات التنصيص: فهي تحمي المسافات والأحرف مثل * من أن يفسرها الغلاف (shell). تشير -- إلى نهاية الخيارات، بحيث يتم التعامل مع المسار الذي يبدأ بواصلة كمسار.

إزالة الملف من الفهرس والاحتفاظ بنسخة Mac

شغّل:

git rm --cached -- "path/to/file"

يزيل الخيار --cached المسار من فهرس Git، وليس من شجرة العمل. يجب أن يظل الملف موجودًا على جهاز Mac الخاص بك. يقوم هذا بتهيئة عملية الإزالة للـ commit التالي؛ ولا يمحو السجل الملتزم به سابقًا للملف. (وثائق Git git rm)

إذا كان المسار داخل دليل وتريد إيقاف تتبع الدليل بالكامل، فأضف -r واستخدم مساره:

git rm --cached -r -- "path/to/directory"

استخدم هذا بحذر: يزيل Git جميع المسارات المتتبعة ضمن هذا الدليل من الفهرس. تظل الملفات المحلية موجودة، ولكن تتم تهيئة عملية الإزالة. إذا رفض Git لأن الملف يحتوي على تغييرات مرحلية أو تختلف محتوياته عن الإصدار الموجود في آخر commit، فتوقف وافحص git status؛ لا تضف -f إلا إذا كنت تفهم ما هي التغييرات المرحلية التي سيتم تجاهلها. يوثق Git فرض العملية (force) كتجاوز لحمايته العادية لمثل هذه التغييرات. (وثائق Git git rm)

التحقق من قاعدة التجاهل ومراجعة ما سيتم الالتزام به (commit)

تأكد من أن نمط .gitignore يطابق المسار من موقع ملف التجاهل هذا. على سبيل المثال، تطابق قاعدة في .gitignore الموجود في جذر المستودع والتي تحتوي على local-settings.json الملفات التي تحمل هذا الاسم في أي مستوى دليل؛ بينما يقيد /local-settings.json المطابقة على جذر المستودع فقط. أنماط Git نسبية بالنسبة للدليل الذي يحتوي على .gitignore، ويمكن لملفات التجاهل الأكثر تحديدًا ذات المستوى الأدنى أن تؤثر على النتيجة. (وثائق Git gitignore)

اسأل Git عن القاعدة التي تطابق الملف الذي تم إيقاف تتبعه الآن:

git check-ignore -v -- "path/to/file"

يعرض الخيار -v المصدر والنمط المسؤولين عن ذلك. إذا لم يطبع هذا أي شيء، فأعد التحقق من الإملاء والمسار وموقع النمط. توصي الأسئلة الشائعة حول Git بـ git rm --cached بالإضافة إلى نمط تجاهل مطابق لإلغاء تتبع ملف متتبع بالفعل وتجاهله. (الأسئلة الشائعة حول Git)

راجع التغيير المرحلي ونسخة العمل قبل عمل commit:

git status

يجب أن تُظهر الحالة أن المسار مرحّل كمحذوف وأن .gitignore معدل إذا لم تكن تغييراته مرحّلة بالفعل. يجب أن يظل ملف العمل موجودًا. قم بتهيئة ملف التجاهل إذا لزم الأمر، ثم قم بعمل commit لكلا التغييرين:

git add -- .gitignore
git commit -m "Stop tracking local file"

إذا كان ملف التجاهل المعني موجودًا في دليل فرعي، فاستخدم مساره النسبي للمستودع في git add. راجع git status مرة أخرى قبل إجراء الـ commit، خاصة إذا كان هناك عمل آخر مرحّلًا، بحيث يحتوي الـ commit فقط على التغييرات التي تقصدها.

ماذا يحدث بعد الـ commit

بعد الـ commit، لا يعود Git يتتبع ذلك المسار في الفرع الحالي، وتمنع قاعدة التجاهل إضافته مرة أخرى عن طريق الخطأ. يسجل الـ commit عملية إزالة، لذا فإن المتعاونين الذين يقومون بعمل checkout لذلك الـ commit سيرون الملف المتتبع محذوفًا من شجرة العمل الخاصة بهم؛ ولا يتم الحفاظ على النسخة المحلية المتجاهلة الخاصة بكل شخص تلقائيًا بواسطة Git. نسّق قبل إجراء الـ commit إذا كان الملف يحتوي على تكوين مشترك لا يزال زملاء الفريق بحاجة إليه. تظل الإصدارات الملتزم بها سابقًا في سجل المستودع، لذا لا يزيل هذا الإجراء النسخ السابقة. (وثائق Git git rm)

إذا كنت تنوي فقط إخفاء التعديلات المحلية مع إبقاء الملف متتبعًا للجميع، فإن .gitignore ليس الآلية المناسبة. ينصح Git بعدم استخدام assume-unchanged أو skip-worktree لهذا الغرض؛ فكّر في استخدام قالب متتبع وملف تكوين محلي متجاهل منفصل بدلاً من ذلك. (الأسئلة الشائعة حول Git)

المصادر