GITREPOSITORY-LAYOUT(5) Git Manual GITREPOSITORY-LAYOUT(5)

gitrepository-layout - ساختار دایرکتوری و چیدمان مخزن گیت

$GIT_DIR/*

یک مخزن گیت در دو نوع متفاوت عرضه می‌شود:

•یک دایرکتوری .git در ریشه درخت کاری (working tree)؛
•یک دایرکتوری <project>.git که یک مخزن خام (bare - یعنی بدون درخت کاری اختصاصی خود) است، که معمولاً برای تبادل تاریخچه‌ها با دیگران از طریق ارسال (push) به آن و واکشی (fetch) از آن استفاده می‌شود.

نکته: همچنین می‌توانید یک فایل متنی ساده به نام .git در ریشه درخت کاری خود داشته باشید که حاوی gitdir: <path> برای اشاره به دایرکتوری واقعی حاوی مخزن باشد. این سازوکار gitfile نامیده می‌شود و معمولاً از طریق دستورات git submodule و git worktree مدیریت می‌شود. این قابلیت اغلب برای درخت کاری یک زیرماژول (submodule checkout) استفاده می‌شود تا به شما در ابرپروژه (superproject) دربرگیرنده اجازه دهد شاخه‌ای را با git checkout بررسی کنید که فاقد آن زیرماژول است. دستور checkout باید کل درخت کاری زیرماژول را بدون از دست دادن مخزن زیرماژول حذف کند.

این موارد ممکن است در یک مخزن گیت وجود داشته باشند:

objects

مخزن اشیاء (object store) مرتبط با این مخزن. معمولاً یک شیءدان خودکفا است (یعنی تمام اشیایی که توسط یک شیء موجود در آن مورد ارجاع قرار گرفته‌اند نیز در آن یافت می‌شوند)، اما چند راه برای نقض این اصل وجود دارد.
1.می‌توانید با ایجاد یک کلون کم‌عمق (shallow clone)، یک مخزن ناقص اما به صورت محلی قابل استفاده داشته باشید. به git-clone(1) مراجعه کنید.
2.می‌توانید از سازوکارهای objects/info/alternates یا $GIT_ALTERNATE_OBJECT_DIRECTORIES برای قرض گرفتن اشیاء از سایر شیءدان‌ها استفاده کنید. مخزنی با این نوع شیءدان ناقص برای انتشار و استفاده با پروتکل‌های انتقال ساده مناسب نیست، اما تا زمانی که objects/info/alternates به شیءدان‌هایی که از آن‌ها اشیاء قرض می‌گیرد اشاره می‌کند مشکلی ندارد.

اگر متغیر $GIT_COMMON_DIR تنظیم شده باشد این دایرکتوری نادیده گرفته شده و به جای آن از "$GIT_COMMON_DIR/objects" استفاده خواهد شد.

objects/[0-9a-f][0-9a-f]

هر شیء تازه ایجادشده در فایل مخصوص به خود ذخیره می‌شود. این اشیاء با استفاده از دو نویسه نخست نام شیء بر مبنای sha1 در میان ۲۵۶ زیرشاخه پخش می‌شوند تا تعداد ورودی‌های دایرکتوری در خود objects در حد قابل مدیریتی باقی بماند. اشیایی که در اینجا یافت می‌شوند اغلب اشیای بسته‌بندی‌نشده (یا منفرد / loose) نامیده می‌شوند.

objects/pack

بسته‌ها (فایل‌هایی که اشیای زیادی را در قالب فشرده به همراه فایل‌های ایندکس نگهداری می‌کنند تا امکان دسترسی تصادفی به آن‌ها فراهم شود) در این دایرکتوری قرار دارند.

objects/info

اطلاعات بیشتر در مورد شیءدان در این دایرکتوری ثبت می‌شود.

objects/info/packs

این فایل به پروتکل‌های انتقال ساده کمک می‌کند تا بسته‌های موجود در این شیءدان را کشف کنند. هر زمان که بسته‌ای اضافه یا حذف می‌شود، در صورتی که مخزن برای انتقال‌های ساده منتشر شده باشد، باید git update-server-info اجرا شود تا این فایل به‌روز نگه داشته شود. git repack به طور پیش‌فرض این کار را انجام می‌دهد.

objects/info/alternates

این فایل مسیرهای شیءدان‌های جایگزینی را که این شیءدان از آن‌ها اشیاء قرض می‌گیرد، در هر خط یک مسیر، ثبت می‌کند. توجه داشته باشید که نه‌تنها ابزارهای بومی گیت از آن به صورت محلی استفاده می‌کنند، بلکه واکشی‌کننده HTTP نیز سعی می‌کند از راه دور از آن استفاده کند؛ اگر در فایل alternates خود مسیرهای نسبی (نسبت به پایگاه‌داده اشیاء، نه نسبت به مخزن!) داشته باشید معمولاً کار خواهد کرد، اما اگر از مسیرهای مطلق استفاده کنید کار نخواهد کرد مگر اینکه مسیر مطلق در فایل‌سیستم و URL وب یکسان باشد. همچنین به objects/info/http-alternates مراجعه کنید.

objects/info/http-alternates

این فایل نشانی‌های اینترنتی URL شیءدان‌های جایگزینی را که این شیءدان از آن‌ها اشیاء قرض می‌گیرد، برای زمانی که مخزن از طریق HTTP واکشی می‌شود ثبت می‌کند.

refs

ارجاعات در زیرشاخه‌های این دایرکتوری ذخیره می‌شوند. دستور git prune می‌داند که باید اشیای قابل دسترسی از ارجاعات موجود در این دایرکتوری و زیرشاخه‌های آن را حفظ کند. اگر متغیر $GIT_COMMON_DIR تنظیم شده باشد، این دایرکتوری (به جز refs/bisect، refs/rewritten و refs/worktree) نادیده گرفته شده و به جای آن از "$GIT_COMMON_DIR/refs" استفاده خواهد شد.

refs/heads/name

اشیای کامیت نوک شاخه name را ثبت می‌کند.

refs/tags/name

نام هر شیئی را ثبت می‌کند (لزوماً یک شیء کامیت نیست، یا شیء تگی که به یک شیء کامیت اشاره کند).

refs/remotes/name

اشیای کامیت نوک شاخه‌های کپی‌شده از یک مخزن راه دور را ثبت می‌کند.

refs/replace/<obj-sha1>

مقدار SHA-1 شیئی را که جایگزین <obj-sha1> می‌شود ثبت می‌کند. این شبیه به info/grafts است و به صورت داخلی توسط git-replace(1) استفاده و نگهداری می‌شود. برخلاف grafts، چنین ارجاعاتی می‌توانند میان مخازن تبادل شوند.

packed-refs

همان اطلاعات refs/heads/، refs/tags/ و موارد مشابه را به روشی کارآمدتر ثبت می‌کند. به git-pack-refs(1) مراجعه کنید. اگر $GIT_COMMON_DIR تنظیم شده باشد این فایل نادیده گرفته شده و به جای آن از "$GIT_COMMON_DIR/packed-refs" استفاده می‌شود.

HEAD

یک ارجاع نمادین یا symref (واژه‌نامه را ببینید) به فضای نام refs/heads/ که شاخه فعال فعلی را توصیف می‌کند. اگر مخزن با هیچ درخت کاری مرتبط نباشد (یعنی یک مخزن خام یا bare)، معنای زیادی ندارد، اما یک مخزن معتبر گیت باید فایل HEAD را داشته باشد؛ برخی ابزارهای سطح بالا (porcelains) ممکن است از آن برای حدس زدن شاخه «پیش‌فرض» مخزن (معمولاً master) استفاده کنند. اگر شاخه نام‌گذاری‌شده name (هنوز) وجود نداشته باشد نیز مجاز است. در برخی ساختارهای قدیمی، به جای یک symref، این فایل یک پیوند نمادین (symlink) است که به شاخه جاری اشاره می‌کند.

همچنین HEAD می‌تواند مستقیماً یک کامیت خاص را ثبت کند، به جای اینکه یک symref برای اشاره به شاخه جاری باشد. چنین وضعیتی اغلب HEAD جداشده (detached HEAD) نامیده می‌شود. برای جزئیات به git-checkout(1) مراجعه فرمایید.

config

فایل پیکربندی اختصاصی مخزن. اگر متغیر $GIT_COMMON_DIR تنظیم شده باشد، این فایل نادیده گرفته شده و از "$GIT_COMMON_DIR/config" استفاده خواهد شد.

config.worktree

فایل پیکربندی اختصاصی دایرکتوری کاری برای دایرکتوری کاری اصلی در ساختار چند درخت کاری (به git-worktree(1) مراجعه کنید).

branches

یک روش منسوخ‌شده برای ذخیره نام‌های کوتاه جهت مشخص کردن یک URL برای دستورات git fetch، git pull و git push. یک فایل می‌تواند به صورت branches/<name> ذخیره شود و سپس name می‌تواند به جای آرگومان repository به این دستورات داده شود. برای جزئیات بخش REMOTES در git-fetch(1) را ببینید. این سازوکار قدیمی است و بعید است در مخازن امروزی یافت شود. اگر $GIT_COMMON_DIR تنظیم شده باشد این دایرکتوری نادیده گرفته شده و از "$GIT_COMMON_DIR/branches" استفاده می‌شود.

گیت در نسخه Git 3.0 خواندن مخازن راه دور از این دایرکتوری را متوقف خواهد کرد.

hooks

هوک‌ها اسکریپت‌های سفارشی‌سازی هستند که توسط دستورات گوناگون گیت استفاده می‌شوند. هنگام اجرای git init تعدادی هوک نمونه نصب می‌شوند، اما همه آن‌ها به طور پیش‌فرض غیرفعال هستند. برای فعال‌سازی، پسوند .sample باید با تغییر نام از انتهای نام فایل حذف شود. برای جزئیات بیشتر درباره هر هوک، githooks(5) را مطالعه کنید. اگر متغیر $GIT_COMMON_DIR تنظیم شده باشد این دایرکتوری نادیده گرفته شده و به جای آن از "$GIT_COMMON_DIR/hooks" استفاده خواهد شد.

common

هنگامی که از چندین درخت کاری استفاده می‌شود، بیشتر فایل‌های موجود در $GIT_DIR به ازای هر درخت کاری مجزا هستند به جز چند استثنای مشخص. با این حال، تمام فایل‌های زیر دایرکتوری common میان تمامی درخت‌های کاری به اشتراک گذاشته خواهند شد.

index

فایل ایندکس فعلی مخزن. معمولاً در یک مخزن خام یافت نمی‌شود.

sharedindex.<SHA-1>

بخش ایندکس مشترک، که توسط $GIT_DIR/index و سایر فایل‌های ایندکس موقت ارجاع داده می‌شود. تنها در حالت ایندکس تقسیم‌شده (split index) معتبر است.

info

اطلاعات بیشتر درباره مخزن در این دایرکتوری ثبت می‌شود. اگر متغیر $GIT_COMMON_DIR تنظیم شده باشد، این دایرکتوری نادیده گرفته شده و از "$GIT_COMMON_DIR/info" استفاده خواهد شد.

info/refs

این فایل به پروتکل‌های انتقال ساده کمک می‌کند تا ارجاعات موجود در این مخزن را کشف کنند. اگر مخزن برای پروتکل‌های ساده منتشر شده باشد، این فایل باید هر بار که یک تگ یا شاخه ایجاد یا اصلاح می‌شود، توسط git update-server-info مجدداً تولید شود. این کار معمولاً از طریق هوک hooks/update انجام می‌شود، که هنگام اجرای دستور git push به درون مخزن، توسط دستور git-receive-pack فراخوانی می‌گردد.

info/grafts

این فایل اطلاعات نسب جعلی کامیت را ثبت می‌کند، تا وانمود کند مجموعه والدین یک کامیت با نحوه ایجاد واقعی کامیت متفاوت است. هر رکورد در یک خط، یک کامیت و والدین جعلی آن را با فهرست کردن نام‌های اشیاء هگزادسیمال ۴۰ بایتی آن‌ها که با یک فاصله جدا شده و با یک خط جدید خاتمه یافته‌اند توصیف می‌کند.

توجه داشته باشید که سازوکار grafts منسوخ شده و می‌تواند منجر به بروز مشکلاتی در انتقال اشیاء میان مخازن شود؛ برای سیستمی انعطاف‌پذیرتر و قوی‌تر جهت انجام همین کار به git-replace(1) مراجعه کنید.

info/exclude

این فایل بر طبق قرارداد میان ابزارهای سطح بالا، لیست الگوهای نادیده‌گیری (exclude) را ذخیره می‌کند. فایل .gitignore فایل نادیده‌گیری به ازای هر دایرکتوری است. دستورات git status، git add، git rm و git clean به آن نگاه می‌کنند اما دستورات هسته‌ای گیت آن را بررسی نمی‌کنند. همچنین ببینید: gitignore(5).

info/attributes

مشخص می‌کند چه مشخصه‌هایی (attributes) به یک مسیر اختصاص داده شود، مشابه فایل‌های .gitattributes به ازای هر دایرکتوری. همچنین ببینید: gitattributes(5).

info/sparse-checkout

این فایل الگوهای بررسی کم‌پشت (sparse checkout) را ذخیره می‌کند. همچنین ببینید: git-read-tree(1).

remotes

نام‌های کوتاه برای URL و نام‌های پیش‌فرض ارجاع را برای استفاده هنگام تعامل با مخازن راه دور از طریق دستورات git fetch، git pull و git push ذخیره می‌کند. برای جزئیات بخش REMOTES در git-fetch(1) را ببینید. این سازوکار قدیمی است و بعید است در مخازن جدید یافت شود. اگر $GIT_COMMON_DIR تنظیم شده باشد این دایرکتوری نادیده گرفته شده و از "$GIT_COMMON_DIR/remotes" استفاده خواهد شد.

گیت در نسخه Git 3.0 خواندن مخازن راه دور از این دایرکتوری را متوقف خواهد کرد.

logs

سوابق تغییرات ایجادشده در ارجاعات در این دایرکتوری ذخیره می‌شوند. برای اطلاعات بیشتر به git-update-ref(1) مراجعه کنید. اگر متغیر $GIT_COMMON_DIR تنظیم شده باشد، این دایرکتوری (به جز logs/HEAD) نادیده گرفته شده و از "$GIT_COMMON_DIR/logs" استفاده خواهد شد.

logs/refs/heads/name

تمامی تغییرات ایجادشده در نوک شاخه به نام name را ثبت می‌کند.

logs/refs/tags/name

تمامی تغییرات ایجادشده در برچسب به نام name را ثبت می‌کند.

shallow

این شبیه به info/grafts است اما به صورت داخلی توسط سازوکار کلون کم‌عمق (shallow clone) استفاده و نگهداری می‌شود. گزینه --depth در git-clone(1) و git-fetch(1) را ببینید. اگر متغیر $GIT_COMMON_DIR تنظیم شده باشد این فایل نادیده گرفته شده و از "$GIT_COMMON_DIR/shallow" استفاده می‌شود.

commondir

اگر این فایل وجود داشته باشد، متغیر $GIT_COMMON_DIR (به git(1) مراجعه کنید) در صورتی که صراحتاً تعیین نشده باشد، برابر با مسیر مشخص‌شده در این فایل قرار خواهد گرفت. اگر مسیر مشخص‌شده نسبی باشد، نسبت به $GIT_DIR سنجیده می‌شود. مخزن دارای commondir بدون مخزنی که توسط "commondir" به آن اشاره شده است ناقص خواهد بود.

modules

شامل مخازن گیت مربوط به زیرماژول‌ها است.

worktrees

حاوی داده‌های مدیریتی برای درخت‌های کاری پیوندداده‌شده است. هر زیرشاخه حاوی بخش مرتبط با درخت کاری یک درخت کاری پیوندداده‌شده است. اگر متغیر $GIT_COMMON_DIR تنظیم شده باشد این دایرکتوری نادیده گرفته شده و در این حالت از "$GIT_COMMON_DIR/worktrees" استفاده خواهد شد.

worktrees/<id>/gitdir

یک فایل متنی حاوی مسیر مطلق بازگشتی به فایل .git که به اینجا اشاره می‌کند. این فایل برای بررسی این موضوع استفاده می‌شود که آیا مخزن پیوندداده‌شده به صورت دستی حذف شده و دیگر نیازی به نگهداری این دایرکتوری نیست یا خیر. زمان تغییر (mtime) این فایل باید با هر بار دسترسی به مخزن پیوندداده‌شده به‌روزرسانی شود.

worktrees/<id>/locked

اگر این فایل وجود داشته باشد، ممکن است درخت کاری پیوندداده‌شده روی یک دستگاه قابل حمل باشد و در دسترس نباشد. وجود این فایل مانع از آن می‌شود که worktrees/<id> به صورت خودکار یا دستی توسط git worktree prune پاکسازی (prune) شود. این فایل ممکن است حاوی رشته‌ای باشد که دلیل قفل بودن مخزن را توضیح می‌دهد.

worktrees/<id>/config.worktree

فایل پیکربندی اختصاصی دایرکتوری کاری.

هر مخزن گیت با یک نسخه عددی در کلید core.repositoryformatversion از فایل config خود مشخص می‌شود. این نسخه قواعد مربوط به کار روی داده‌های مخزن روی دیسک را مشخص می‌کند. هر پیاده‌سازی گیت که نسخه خاص اعلام‌شده توسط یک مخزن روی دیسک را درک نکند، نباید روی آن مخزن عملیاتی انجام دهد؛ انجام چنین کاری نه‌تنها خطر تولید نتایج نادرست را به همراه دارد، بلکه عملاً ممکن است موجب از دست رفتن داده‌ها شود.

به دلیل این قاعده، ارتقای نسخه باید در کمترین حد مطلق نگه داشته شود. در عوض، ما معمولاً این راهبردها را ترجیح می‌دهیم:

•ارتقای شماره نسخه قالب فایل‌های داده‌ای منفرد (مانند index، فایلهای pack و غیره). این کار ناسازگاری‌ها را تنها به همان فایل‌ها محدود می‌کند.
•معرفی داده‌های جدیدی که هنگام استفاده توسط کلاینت‌های قدیمی‌تر به زیبایی تنزل می‌یابند (به عنوان مثال، فایل‌های نقشه بیتی pack توسط کلاینت‌های قدیمی نادیده گرفته می‌شوند، و آن‌ها صرفاً از بهینه‌سازی ارائه‌شده توسط این فایل‌ها بهره‌مند نمی‌شوند).

ارتقای نسخه قالب کل مخزن باید تنها بخشی از تغییری باشد که نتوان آن را به صورت مستقل نسخه‌بندی کرد. به عنوان مثال، اگر کسی بخواهد قواعد دسترسی‌پذیری اشیاء یا قواعد قفل کردن ارجاعات را تغییر دهد، این امر نیازمند ارتقای نسخه قالب مخزن خواهد بود.

توجه داشته باشید که این موضوع تنها در مورد دسترسی مستقیم به محتویات دیسک مخزن صدق می‌کند. یک کلاینت قدیمی‌تر که تنها فرمت 0 را می‌فهمد همچنان می‌تواند از طریق git:// به مخزنی متصل شود که از فرمت 1 استفاده می‌کند، تا زمانی که فرآیند سرور فرمت 1 را درک کند.

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

نسخه‌های قالب فعلی تعریف‌شده عبارتند از:

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

این قالب با نسخه 0 یکسان است، به استثنای موارد زیر:

1.هنگام خواندن متغیر core.repositoryformatversion، یک پیاده‌سازی گیت که از نسخه ۱ پشتیبانی می‌کند باید تمام کلیدهای پیکربندی موجود در بخش extensions از فایل پیکربندی را نیز بخواند.
2.اگر یک مخزن نسخه ۱ هر کلیدی از extensions.* را مشخص کرده باشد که گیت در حال اجرا آن را پیاده‌سازی نکرده است، عملیات نباید ادامه یابد. به همین ترتیب، اگر مقدار هر کلید شناخته‌شده‌ای توسط پیاده‌سازی درک نشود، عملیات نباید ادامه یابد.

توجه داشته باشید که اگر هیچ افزونه‌ای در فایل پیکربندی مشخص نشده باشد، آنگاه core.repositoryformatversion باید روی 0 تنظیم شود (تنظیم آن روی 1 هیچ مزیتی ندارد و مخزن را با پیاده‌سازی‌های قدیمی‌تر گیت ناسازگار می‌کند).

افزونه‌های تعریف‌شده در بخش extensions.* از git-config(1) آورده شده‌اند. هر پیاده‌سازی که مایل به تعریف یک افزونه جدید باشد باید یادداشتی از آن در آنجا بگذارد تا نام را به خود اختصاص دهد.

git-init(1), git-clone(1), git-config(1), git-fetch(1), git-pack-refs(1), git-gc(1), git-checkout(1), gitglossary(7), The Git User’s Manual[1]

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

1.
The Git User’s Manual
file:///usr/share/doc/git-doc/user-manual.html
2026-06-29 Git 2.55.0