GITFORMAT-LOOSE(5) راهنمای Git GITFORMAT-LOOSE(5)

gitformat-loose - ساختار و قالب اشیاء منفرد (loose objects) در گیت

$GIT_DIR/objects/[0-9a-f][0-9a-f]/*
$GIT_DIR/objects/object-map/map-*.map

اشیاء منفرد (Loose objects) روشی هستند که گیت برای ذخیره‌سازی اشیاء مستقل استفاده می‌کند، به‌طوری که هر شیء به عنوان یک فایل مجزا نوشته می‌شود.

در طول چرخه حیات یک مخزن، اشیاء معمولاً در ابتدا به عنوان اشیاء منفرد نوشته می‌شوند. در نهایت، این اشیاء منفرد از طریق عملیات نگهداری مخزن (maintenance) در فایل‌های بسته (packfiles) فشرده و جمع‌آوری می‌شوند تا استفاده از فضای دیسک بهینه شده و جستجوی این اشیاء سرعت یابد.

هر شیء منفرد شامل یک پیشوند (prefix) است که بلافاصله پس از آن داده‌های شیء قرار می‌گیرند. پیشوند شامل <type> <size>\0 است. مقدار <type> یکی از مقادیر blob، tree، commit یا tag است و size اندازه داده‌ها (بدون احتساب پیشوند) به عنوان یک عدد صحیح ده‌دهی در قالب اَسکی (ASCII) می‌باشد.

سپس کل محتوا (پیشوند به همراه داده‌ها) با الگوریتم zlib فشرده شده و داده‌های فشرده درون فایل ذخیره می‌شوند. شناسه شیء (object ID) درهم‌سازی (هش) SHA-1 یا SHA-256 (بسته به پیکربندی) از داده‌های غیرفشرده است.

فایل مربوط به شیء منفرد در پوشه objects ذخیره می‌شود، به این صورت که دو نویسه هگزادسیمال نخست شناسه شیء نام پوشه را تشکیل می‌دهند و نویسه‌های باقی‌مانده نام فایل خواهند بود. این کار برای قطعه‌بندی (sharding) داده‌ها و جلوگیری از قرارگیری فایل‌های بیش از حد در یک پوشه واحد انجام می‌شود، زیرا برخی از سیستم‌های فایل در صورت وجود تعداد بسیار زیادی فایل در یک پوشه دچار افت کارایی می‌شوند.

به عنوان نمونه، یک درخت تهی (empty tree) حاوی داده‌های فشرده‌نشده tree 0\0 است و در یک مخزن SHA-256، شناسه شیء آن 6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321 خواهد بود و در مسیر $GIT_DIR/objects/6e/f19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321 ذخیره می‌گردد.

به طور مشابه، یک شیء blob که محتوای آن abc است، دارای داده‌های غیرفشرده blob 3\0abc خواهد بود.

هنگامی که گزینه compatObjectFormat استفاده می‌شود، گیت باید یک نگاشت میان الگوریتم اصلی مخزن و الگوریتم سازگاری برای اشیاء منفرد و همچنین برخی اطلاعات کمکی ذخیره کند.

این نگاشت شامل مجموعه‌ای از فایل‌ها در مسیر $GIT_DIR/objects/object-map با پسوند .map است. بخش نام فایل پیش از پسوند، همان چکسام هش اصلی (یعنی همان که در extensions.objectformat مشخص شده) در قالب هگزادسیمال است.

دستور git gc ورودی‌های موجود را مجدداً در یک فایل بسته‌بندی می‌کند و اشیاء غیرضروری مانند ورودی‌های کم‌عمق (shallow) منسوخ‌شده یا اشیاء منفردی که بسته‌بندی شده‌اند را حذف می‌نماید.

قالب فایل به شرح زیر است. تمام مقادیر در ترتیب بایت شبکه (network byte order) هستند و تمام مقادیر ۴ بایتی و ۸ بایتی باید در فایل هم‌تراز ۴ بایت (4-byte aligned) باشند؛ بنابراین ممکن است در برخی موارد به پدینگ NUL نیاز باشد. گیت همیشه از کمترین تعداد بایت NUL (شامل صفر) که برای پدینگ لازم است استفاده می‌کند تا نوشتن فایل‌ها قطعی و معین (deterministic) باشد.

•سرایند در ابتدای فایل قرار دارد و شامل موارد زیر است:
•امضای ۴ بایتی نگاشت: LMAP
•شماره نسخه ۴ بایتی: 1
•طول ۴ بایتی بخش سرایند (شامل ورودی‌های رزروشده اما بدون احتساب پدینگ NUL).
•تعداد ۴ بایتی اشیاء تعریف‌شده در این فایل نگاشت.
•تعداد ۴ بایتی قالب‌های شیء تعریف‌شده در این فایل نگاشت.
•برای هر قالب شیء:
•شناسه ۴ بایتی قالب (برای نمونه sha1 برای SHA-1)
•طول ۴ بایتی (بر حسب بایت) برای نام‌های کوتاه شده اشیاء (یعنی پیشوندهای نام‌های کامل اشیاء). این کوتاه‌ترین طول ممکن است که برای رفع ابهام نام‌ها در جدول نام‌های کوتاه شده اشیاء لازم است.
•عدد صحیح ۸ بایتی، که مشخص می‌کند جدول‌های مربوط به این قالب در کجای این فایل نمایه ذخیره شده‌اند، به صورت آفست از ابتدای فایل.
•آفست ۸ بایتی به بخش انتهایی (trailer) از ابتدای این فایل.
•باقی‌مانده بخش سرایند برای استفاده‌های آتی رزرو شده است. خوانندگان باید داده‌های ناشناخته در اینجا را نادیده بگیرند.
•صفر یا چند بایت NUL. این بایت‌ها برای بهبود هم‌ترازی مقادیر ۴ بایتی زیر استفاده می‌شوند.
•جدول‌های مربوط به نخستین قالب شیء:
•یک جدول مرتب‌شده از نام‌های کوتاه شده اشیاء. این‌ها پیشوندهای نام‌های همه اشیاء موجود در این فایل هستند که در کنار هم بسته‌بندی شده‌اند تا اثر حافظه کش در جستجوی دودویی برای یک نام شیء خاص کاهش یابد.
•یک جدول مرتب‌شده از نام‌های کامل اشیاء.
•جدولی از مقادیر فراداده ۴ بایتی.
•صفر یا چند بایت NUL.
•جدول‌های مربوط به قالب‌های بعدی شیء:
•یک جدول مرتب‌شده از نام‌های کوتاه شده اشیاء. این‌ها پیشوندهای نام‌های همه اشیاء موجود در این فایل هستند که بدون مقادیر آفست در کنار هم بسته‌بندی شده‌اند تا اثر حافظه کش در جستجوی دودویی برای یک نام شیء خاص کاهش یابد.
•جدولی از نام‌های کامل اشیاء به ترتیبی که توسط نخستین قالب شیء مشخص شده است.
•جدولی از مقادیر ۴ بایتی که ترتیب نام‌های شیء را به ترتیب نخستین قالب شیء نگاشت می‌کند. برای یک شیء در جدول نام‌های کوتاه شده مرتب، مقدار در شاخص متناظر در این جدول، همان شاخص در جدول پیشین برای همان شیء است.
•صفر یا چند بایت NUL.
•بخش انتهایی (trailer) شامل موارد زیر است:
•چکسام درهم‌سازی تمام موارد فوق با استفاده از هش اصلی.

شش بیت پایین هر جدول فراداده شامل یک فیلد نوع است که دلیل ذخیره‌سازی این شیء را نشان می‌دهد:

0

رزرو شده.

1

این شیء به عنوان یک شیء منفرد در مخزن ذخیره شده است.

2

این شیء یک ورودی کم‌عمق (shallow entry) است. نگاشت به مقدار کم‌عمقی اشاره دارد که توسط یک سرور راه دور برگردانده شده است.

3

این شیء یک ورودی زیرماژول (submodule entry) است. نگاشت به کامیت ذخیره‌شده اشاره دارد که نمایانگر یک زیرماژول است.

ممکن است در آینده داده‌های دیگری در این فیلد ذخیره شود. بیت‌هایی که استفاده نمی‌شوند باید صفر باشند.

بخشی از مجموعه git(1)

2026-06-29 Git 2.55.0