كيف يعرف Git أسماء الملفات؟
أصبح Git قادرا على تخزين محتوى الملف داخل Blob و الوصول إليه عبر معرفه. لكن الـ Blob نفسه لا يحمل اسم الملف. فكيف يحتفظ Git بالاسم و مكان الملف داخل المشروع؟
يضيف Git Object آخر يربط الأسماء بالـ Objects التي تحمل البيانات. يسمى هذا النوع Tree.
كيف يربط الـ Tree الاسم بالمحتوى؟
يمثل كل Tree مجلدا واحدا. و يحتوي على مدخل لكل ملف أو مجلد فرعي موجود داخله. يحفظ مدخل الملف ثلاث معلومات نحتاجها هنا:
- اسم الملف.
- الـ mode الخاص به.
- معرف الـ Blob الذي يحمل محتواه.
على سبيل المثال إذا كان لدينا المشروع التالي:
project/
└── hello.txtفإن الـ Tree الذي يمثل مجلد المشروع يحتوي على مدخل شبيه بالتالي:
Tree
└── hello.txt → Blob 9f4d96dيوجد اسم hello.txt داخل الـ Tree، بينما يبقى النص Hello Git داخل الـ Blob.

كيف تتكون المجلدات؟
يمكن أن يشير مدخل داخل Tree إلى Tree آخر. بهذه الطريقة يمثل Git المجلدات الفرعية:
Tree (project)
└── src → Tree
└── app.js → Blobيمثل الـ Tree الأول مجلد المشروع، بينما يمثل الثاني مجلد src. أما مدخل app.js فيشير إلى Blob يحمل محتوى الملف.

لنجرب بأنفسنا
ستجد في الـ Terminal ملفين هما hello.txt و copy.txt. يحمل الملفان المحتوى نفسه Hello Git. لنر كيف يحتفظ Git بالاسمين من دون تكرار الـ Blob.
أنشئ أول لقطة للمشروع:
git add .
git commit -m "snapshot"ستظهر الـ Commit و الـ Tree و الـ Blob في الرسم البياني بجانبك.
ابدأ بعرض سجل الـ Commits:
git logاستبدل <commit-hash> بالمعرف الذي ظهر ثم اقرأ الـ Commit للحصول على معرف الـ Tree:
git cat-file -p <commit-hash>سيبدأ مخرج الـ Commit بسطر tree. انسخ المعرف من هذا السطر ثم استخدمه مكان <tree-hash> في الأمر التالي:
git cat-file -p <tree-hash>ستجد سطرين للملفين copy.txt و hello.txt. يعرض 100644 الـ mode الخاص بالملف و يعرض العمود الأخير اسمه. أما المعرف في الوسط فهو نفسه في السطرين لأن الملفين يشيران إلى الـ Blob نفسه.
الصورة الحالية
أصبح لدينا الآن نوعان من الـ Objects:
Blob
└── File Content
Tree
├── Names
├── Modes
└── Object IDsيخزن الـ Blob المحتوى. و يربط الـ Tree أسماء الملفات و المجلدات بالـ Objects التي تمثلها. لكن الـ Tree لا يحمل معلومات اللقطة مثل المؤلف و الرسالة. في الدرس التالي سنرى كيف يربط الـ Commit بنية المشروع بهذه المعلومات.