■ space · مسبار المطاردة · fig 1

‏Git يصعد عبر الشجرة مطاردًا .git، وينتهي عند الأول — خمسة أشياء تكسر هذه المطاردة، وأمر واحد يفرزها.

■ الإجابة أولًا

شغّل git rev-parse --show-toplevel || ls -a — أمر واحد يفرز الأسباب قبل أن تلمس أي شيء.

الجذر طُبع → أنت واقف خارج المستودع؛ cd موجود. لا .git في ls -a → لم يكن مستودعًا قط: أعد النسخ، لا git init.

خطأ في كل مستودع بالآلة → مُصدَّر GIT_DIR ; unset GIT_DIR.

5أسبابًا خلف سطر fatal واحد
1أمر يفرزها
20دقيقة كلفة رهان المجلد-ما-فوق

01المطاردة

git يطارد إدخالًا واحدًا، صاعدًا، وينتهي عند الأول — الآلة تعيد تشغيل المطاردة

شكل 1 · مسبار المطاردةمفاتيح 1–6 — أو الأزرار
هدف worktreeمُنتقل · محذوفsrc/api/F1myapp/F2projects/F3home/you/F4.git.gitGIT_DIR=/some/old/pathأنتالمطاردة← كتبت git pull هنا
المسبار
$ git rev-parse --show-toplevel
/home/you/projects/myapp

وُجد — المطاردة توقفت عند .GITالإصلاح — لا شيء يُصلَح: المطاردة سليمة

انطلاقsrc/api/ · طوابق ملموسة2 · الحكموُجد

أنت هنا → كتبت git pull هنا → المطاردة تقف هنا، عند أول .git تلقاه

02جدول الأسباب

خمسة أشياء تكسر المطاردة — طابق عرضك مع صف

العرضالسبب المرجّحالإصلاح
خطأ في مشروع واحد،ls -a لا يُظهر.gitتنزيل ZIP / ملفات منسوخةgit clone من جديد
خطأ من مجلد فرعي، الجذر يعملواقف خارج الشجرةcd "$(git rev-parse --show-toplevel)"
خطأ في كل دليل، حتى التي كانت تعملGIT_DIR مُصدَّرunset GIT_DIR، أزله من ملف shell الشخصي
خطأ داخل مجلد submodulesubmodule لم يُهيّأ قطgit submodule update --init --recursive
.git ملف، والخطأ يثبتمؤشر worktree/submodule معلّقgit worktree repair، غير ذلك أعد النسخ

تحقّق:git rev-parse --show-toplevel → مسار جذر المستودع، بلا خطأ

03الأولان يكذبان

الجدول يصلح العروض؛ السببان الأولان هما حيث يكذب الذاكرة العضلية

شكل المجلد الفرعي—فعلتcd إلىdocs/ أوsrc/api/ وعادة الصدفة تقول إن الجذر هنا — git يصعد، لا يجد شيئًا، ينصرف
شكل الاستنساخ—git clone يرسم دائمًا مجلدًا فرعيًا باسم المستودع — الcheckout يجلس مستوى واحد تحت حيث تقف
شكل zip—‏Code → Download ZIP يرسل لقطة المصدر وحدها: بلا.git، بلا تاريخ، بلا remote
شكل النسخ—ملفات منسوخة بلا المجلد الخفي — أداة تنظيف حذفت.git بوصفها «خبثًا خفيًا» تنتهي هي الأخرى كذلك
اقفز إلى الجذر — يعمل من أي عمق داخل المستودع
git rev-parse --show-toplevel   # prints the root when one exists
cd "$(git rev-parse --show-toplevel)"   # jump there in one step
لم يكن مستودعًا قط — استعد التاريخ
ls -a   # no .git here
git clone <url>   # the fix — again, not git init

git init لا يصلح مستودعًا — يرسم واحدًا فارغًا حيث تقف.

04الثلاثة الأخيرة تتبعك

التبقّية الثلاثة بيئية — الخطأ يُصدَّر، أو يعلّق، أو لم يولد

العلامة: git عمل هنا قبل ساعة
env | grep GIT_DIR     # GIT_DIR=/some/old/path
unset GIT_DIR
‏GIT_DIR مُصدَّر—مسار ثابت واحد يزاحم الاكتشاف، فيصير كل دليل «عادي» «ليس مستودعًا» — إن عاد كل صباح، فسطر في~/.bashrc،~/.zshrc، أو غلاف CI يصدّره: أزله عندها
مؤشر ميت—.git ملفًا من سطر واحد يسمي دليلًا في موضع آخر من القرص؛ الهدف انتقل أو حُذف → يعلق المؤشر ويثبت الخطأ وإن كان.git هناك عين العين —git worktree repair يعيد الوصل ما يقدر عليه، وغير ذلك: أعد النسخ
submodule—المجلد موجود في شجرة المستودع الأب لكنه لم يُهيّأ قط — لا.git فيه بعد؛git submodule update --init --recursive من الأب يملؤه

الغرباء غير المرصودين يركبون مع الأشجار المنسوخة — جولة clean تُوطنهم ما إن يقوم الاستنساخ

■ ختم الأمانة مُختبَر على: git 2.4x · bash + zsh · submodules وworktrees. نُشر أول مرة 2026-09-28. البحث الصاعد، وتجاوز GIT_DIR، وملف مؤشر worktree هي سلوك الاكتشاف الموثَّق في git؛ والأسباب الخمسة هي الطقم الكامل خلف هذا الخطأ، مكتوبة من مستودعات عادت من الموت.

نهاية الأسباب الخمسة · لم يُجلب شيء · كل شيء محلي