MASTRILOالدورة/كيف يعرف Git أسماء الملفات؟
MASTRILO

كيف يعرف Git أسماء الملفات؟

أصبح Git قادرا على تخزين محتوى الملف داخل Blob و الوصول إليه عبر معرفه. لكن الـ Blob نفسه لا يحمل اسم الملف. فكيف يحتفظ Git بالاسم و مكان الملف داخل المشروع؟

يضيف Git Object آخر يربط الأسماء بالـ Objects التي تحمل البيانات. يسمى هذا النوع Tree.

كيف يربط الـ Tree الاسم بالمحتوى؟

يمثل كل Tree مجلدا واحدا. و يحتوي على مدخل لكل ملف أو مجلد فرعي موجود داخله. يحفظ مدخل الملف ثلاث معلومات نحتاجها هنا:

  • اسم الملف.
  • الـ mode الخاص به.
  • معرف الـ Blob الذي يحمل محتواه.

على سبيل المثال إذا كان لدينا المشروع التالي:

text
project/
└── hello.txt

فإن الـ Tree الذي يمثل مجلد المشروع يحتوي على مدخل شبيه بالتالي:

text
Tree
└── hello.txt → Blob 9f4d96d

يوجد اسم hello.txt داخل الـ Tree، بينما يبقى النص Hello Git داخل الـ Blob.

بطاقة Tree تربط اسم الملف hello.txt بالمعرف 9f4d96d الذي يشير إلى Blob يحفظ المحتوى Hello Git
يربط الـ Tree اسم الملف بمعرف الـ Blob الذي يحمل محتواه

كيف تتكون المجلدات؟

يمكن أن يشير مدخل داخل Tree إلى Tree آخر. بهذه الطريقة يمثل Git المجلدات الفرعية:

text
Tree (project)
└── src → Tree
          └── app.js → Blob

يمثل الـ Tree الأول مجلد المشروع، بينما يمثل الثاني مجلد src. أما مدخل app.js فيشير إلى Blob يحمل محتوى الملف.

سلسلة تبدأ بـ Tree للمشروع يحتوي على src ثم Tree يحتوي على app.js و يشير إلى Blob
يربط Tree المشروع اسم src بـ Tree آخر ثم يربط هذا الـ Tree اسم app.js بالـ Blob

لنجرب بأنفسنا

ستجد في الـ Terminal ملفين هما hello.txt و copy.txt. يحمل الملفان المحتوى نفسه Hello Git. لنر كيف يحتفظ Git بالاسمين من دون تكرار الـ Blob.

أنشئ أول لقطة للمشروع:

bash
git add .
git commit -m "snapshot"

ستظهر الـ Commit و الـ Tree و الـ Blob في الرسم البياني بجانبك.

ابدأ بعرض سجل الـ Commits:

bash
git log

استبدل <commit-hash> بالمعرف الذي ظهر ثم اقرأ الـ Commit للحصول على معرف الـ Tree:

bash
git cat-file -p <commit-hash>

سيبدأ مخرج الـ Commit بسطر tree. انسخ المعرف من هذا السطر ثم استخدمه مكان <tree-hash> في الأمر التالي:

bash
git cat-file -p <tree-hash>

ستجد سطرين للملفين copy.txt و hello.txt. يعرض 100644 الـ mode الخاص بالملف و يعرض العمود الأخير اسمه. أما المعرف في الوسط فهو نفسه في السطرين لأن الملفين يشيران إلى الـ Blob نفسه.

الصورة الحالية

أصبح لدينا الآن نوعان من الـ Objects:

text
Blob
└── File Content
 
Tree
├── Names
├── Modes
└── Object IDs

يخزن الـ Blob المحتوى. و يربط الـ Tree أسماء الملفات و المجلدات بالـ Objects التي تمثلها. لكن الـ Tree لا يحمل معلومات اللقطة مثل المؤلف و الرسالة. في الدرس التالي سنرى كيف يربط الـ Commit بنية المشروع بهذه المعلومات.

اختبر معلوماتك

سجّل دخولك للإجابة على الأسئلة وحفظ تقدّمك.

سجّل الدخول
اللوحات
نوع الخط
حجم الخط
أكملت 0 من 41 درس

Git Objects

3.كيف يعرف Git أسماء الملفات؟

Git on Your Machine641 كيف يعرف Git أسماء الملفات؟مكافأة إكمال الدرس إضافة إلى نقاط أنشطته. 10 XP. تُمنح المكافأة مرة واحدة فقط.