إذا قام Git فجأة بتمييز كل ملف تقريباً على أنه مُعدل على جهاز Mac الخاص بك، فقد يكون تحويل نهايات الأسطر هو السبب في جعل نسخة العمل تختلف عن النسخة التي يتتبعها Git. تفقد أولاً المستودع قبل تغيير الملفات أو استعادتها. ثم استخدم إعدادات Git المناسبة لنظام macOS، ولا تقم بإعادة الضبط القياسي إلا بعد حماية أي تعديلات حقيقية. يوصي Git بتخزين النصوص بنهايات LF؛ وتستخدم إرشاداته لنظام macOS الإعداد core.autocrlf input. دليل نهايات الأسطر من GitHub
لماذا يمكن لنهايات الأسطر أن تجعل كل ملف يبدو وكأنه قد تغير؟
تحدد نهاية السطر ختام كل سطر: يستخدم أسلوب Unix (LF) حرفاً واحداً، بينما يستخدم أسلوب Windows (CRLF) محرف إرجاع أول السطر (carriage return) بالإضافة إلى تغذية السطر (line feed). إذا قام Git أو أحد المحررات بتغيير النهايات في جميع أنحاء نسخة العمل، فقد يبلغ Git عن تغييرات واسعة في الملفات حتى لو كان النص نفسه يبدو متطابقاً. يمكن لـ Git ضبط النصوص قياسياً إلى LF في الفهرس الخاص به وتطبيق نهايات مختلفة عند استخراج الملفات (checkout)، اعتماداً على التكوين وملف .gitattributes. وثائق gitattributes الخاصة بـ Git
افحص المستودع قبل إصلاحه
افتح Terminal، وانتقل إلى المستودع، وتحقق من حالته وإعدادات نهايات الأسطر:
git status --short
git config --show-origin --get core.autocrlf
git ls-files --eol
قد لا يُرجع أمر التكوين (config) أي شيء إذا لم يتم تعيين أي قيمة. يساعد الخيار --show-origin في تحديد ملف التكوين الذي وفّر هذا الإعداد. في أمر git ls-files --eol، قارن بين نهايات الفهرس (i/) وشجرة العمل (w/)؛ تشير القيمة mixed إلى وجود نهايات أسطر مختلطة. تُظهر قيمة attr/ السمات السارية. يوثق Git هذا الإخراج كأداة تشخيصية للفهرس، وشجرة العمل، وسمات نهايات الأسطر. وثائق git-ls-files الخاصة بـ Git
تحقق أيضاً من وجود تعديلات فعلية قبل المتابعة. إذا وجدت تغييرات ترغب في الاحتفاظ بها، فقم بإجراء commit لها أو انسخها إلى مكان آمن. لا تستخدم أمر استعادة (restore) أو إعادة تعيين (reset) شامل كحل لمشكلة نهايات الأسطر: حيث يمكن لتلك الأوامر التخلص من عملك. تتطلب الملفات الثنائية (Binary) عناية خاصة لأن تحويل نهايات الأسطر يمكن أن يؤدي إلى إتلاف البيانات إذا تعامل Git معها كنصوص. وثائق git-config الخاصة بـ Git
عيّن خياراً افتراضياً منطقياً لنظام macOS
لاستخدامك الخاص لـ Git عبر المستودعات المختلفة، اضبط التفضيل الموثق الخاص بنظام macOS:
git config --global core.autocrlf input
باستخدام input، يقوم Git بتحويل CRLF إلى LF قياسياً عند إضافة نص، دون تحويل ملفات LF إلى CRLF عند استخراج الملفات. لا يحسم هذا الإعداد السياسة الخاصة بكل ملف: حيث يمكن لسمات المستودع تحديد السلوك حسب نوع الملف، وتتحكم سمتا text وeol في Git في الضبط القياسي ونهايات الأسطر عند الاستخراج. إرشادات GitHub الخاصة بكل نظام تشغيل ومرجع تكوين Git
إذا كانت المشكلة مقتصرة على مشروع واحد، ففضّل سياسة .gitattributes الخاصة بذلك المشروع على تغيير التكوين العام (global) الخاص بك ليناسب مستودعاً واحداً. نقطة البداية الشائعة هي * text=auto؛ ويمكن تثبيت تنسيقات معينة على LF أو CRLF، بينما ينبغي تمييز التنسيقات الثنائية كـ binary. على سبيل المثال، تحتاج نصوص shell البرمجية عادةً إلى LF، بينما تتطلب بعض ملفات مشاريع Windows استخدام CRLF. تعتمد الأنماط الصحيحة على أدوات المستودع والمتعاونين فيه. أمثلة gitattributes الخاصة بـ Git
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
*.png binary
لا تقم بإعادة الضبط القياسي إلا بعد مراجعة التغييرات
لا يضمن تغيير التكوين أو السمات أن تصبح الملفات الحالية متسقة على الفور. يتضمن إجراء التحديث الموثق من GitHub حفظ أو إيداع (commit) العمل المعلق أولاً، ثم تشغيل git add --renormalize . ومراجعة الحالة الناتجة. تعليمات التحديث من GitHub
بعد حفظ تعديلاتك بأمان والاستقرار على سياسة المستودع، قم بتجهيز (stage) الضبط القياسي وافحص بدقة ما يقترحه Git:
git add --renormalize .
git status --short
git diff --cached --stat
git diff --cached
لا تقم بعملية الإيداع (commit) تلقائياً. راجع الفروق المجهزة (staged diff)، خاصة الملفات الثنائية أو المُنشأة تلقائياً غير المتوقعة. إذا كان لا يزال يعرض تغييرات في المحتوى لم تكن تقصدها، فتوقف وافحص المسارات المتأثرة وقيم attr/ الخاصة بها باستخدام git ls-files --eol؛ وصحح سياسة السمات قبل التجهيز مرة أخرى. يمكن أن تؤدي إعادة الضبط القياسي إلى ظهور فروقات (diff) مشروعة وكبيرة الحجم إذا كان المستودع يخزن نهايات غير متسقة في السابق، لذا نسّق إيداع إعادة الضبط القياسي مع المتعاونين معك عند الحاجة.
إذا ظلت الملفات مُعدلة
تعد نهايات الأسطر سبباً محتملاً واحداً فقط. ابحث عن الفروق الجوهرية في الـ diff المجهز أو غير المجهز، وتحقق مما إذا كان المحرر قد أعاد كتابة الملفات، وافحص المرشحات (filters) أو السمات الخاصة بملفات معينة. إذا أبلغ git ls-files --eol عن i/lf وw/crlf، فتأكد مما إذا كانت هناك سمة أو إعداد يطلب CRLF عن قصد. وإذا أبلغ عن mixed، فحدد الملفات التي تحتوي على نهايات مختلطة وما إذا كانت نصوصاً بالفعل قبل إجراء الضبط القياسي. يمكن لفحوصات الأمان في Git أن تحذر من التحويلات التي لا رجعة فيها، لكنها لا تستطيع تحديد ما إذا كان الملف قد تم تصنيفه بشكل خاطئ كنص. مرجع تكوين Git
التسلسل العملي هو: احمِ التعديلات، وافحص core.autocrlf وgit ls-files --eol، واختر سياسة متسقة للمشروع، ثم أعد الضبط القياسي وراجع الـ diff. يعالج هذا التشويش الناجم عن نهايات الأسطر مع إبقائك متحكماً في أي تغييرات حقيقية في المحتوى.
المصادر
تكوين Git للتعامل مع نهايات الأسطر — GitHub Docs
Git - وثائق git-config — Git
Git - وثائق git-ls-files — Git