| GIT-PACK-OBJECTS(1) | Git Manual | GIT-PACK-OBJECTS(1) |
نام (NAME)
git-pack-objects - ایجاد یک بایگانی فشرده و بستهبندیشده از اشیا
خلاصه دستور (SYNOPSIS)
git pack-objects [-q | --rogress
| --ll-progress] [--ll-progress-implied]
[--0-reuse-delta] [--elta-base-offset] [--0n-empty]
[--
[--evs [--npacked | --ll]] [--ep-pack=<pack-name>]
[--ruft] [--ruft-expiration=<time>]
[--dout [--lter=<filter-spec>] | <base-name>]
[--allow] [--ep-true-parents] [--
[--0me-hash-version=<n>] [--ath-walk]
< <object-list>
توضیحات (DESCRIPTION)
فهرستی از اشیا را از ورودی استاندارد میخواند و یک یا چند بایگانی بستهبندیشده (pack) با نام پایه مشخصشده را روی دیسک مینویسد، یا یک بایگانی بستهبندیشده را به خروجی استاندارد ارسال میکند.
بایگانی بستهبندیشده روشی کارآمد برای انتقال مجموعهای از اشیا میان دو مخزن و همچنین یک قالب بایگانی با دسترسی بهینه است. در یک بایگانی بستهبندیشده، هر شیء یا بهصورت فشرده و کامل ذخیره میشود و یا بهصورت تفاوت (دیف) نسبت به شیء دیگر نگهداری میگردد؛ که مورد دوم اغلب دلتا (delta) نامیده میشود.
قالب بایگانی بستهبندیشده (.pack) بهگونهای خودکفا طراحی شده است که بدون نیاز به اطلاعات تکمیلی بتوان آن را استخراج کرد. از این رو، هر شیئی که یک دلتا به آن وابسته است باید درون همان بسته (pack) موجود باشد.
یک فایل ایندکس بسته (.idx) برای دسترسی تصادفی و سریع به اشیای موجود در بسته تولید میشود. قرار دادن هم فایل ایندکس (.idx) و هم بایگانی بستهبندیشده (.pack) در زیرپوشه pack/ از $GIT_OBJECT_DIRECTORY (یا هر یک از دایرکتوریهای موجود در $GIT_ALTERNATE_OBJECT_DIRECTORIES) به Git امکان میدهد تا از این بایگانی بسته بخواند.
دستور git unpack-objects میتواند بایگانی بستهبندیشده را خوانده و اشیای موجود در بسته را به قالب «یک شیء در هر فایل» باز کند؛ این کار معمولاً توسط دستورات واکشی هوشمند (smart-pull) هنگام ایجاد بسته در لحظه برای انتقال کارآمد روی شبکه توسط طرفهای مقابل انجام میشود.
گزینهها (OPTIONS)
base-name
--dout
--evs
--npacked
--ll
--include-tag
--din-packs[=<mode>]
هنگامی که mode برابر "follow" باشد، بستهها میتوانند علاوه بر این با علامت ! پیشوند شوند، که نشان میدهد آنها مستثنی هستند اما لزوماً تحت دسترسپذیری بسته نشدهاند. علاوه بر اشیای موجود در بستههای گنجاندهشده، بسته نهایی ممکن است بر اساس موارد زیر شامل اشیای اضافی نیز باشد:
این حالت برای مثال برای احیای اشیایی که زمانی غیرقابل دسترس بودهاند و در بستههای بیاستفاده (cruft) قرار دارند مفید است، تا بستههایی تولید شوند که تا مرز تعیینشده توسط بستههای مستثنیشده تحت دسترسپذیری بسته باشند.
ناسازگار با --evs، یا گزینههایی که مستلزم --evs هستند (مانند --ll)، به استثنای --npacked که سازگار است.
--ruft
هنگامی که ورودی بستهای حاوی تمام اشیای قابل دسترس را فهرست کند (و همه بستههای دیگر را در انتظار حذف اعلام کند)، بسته cruft متناظر شامل تمام اشیای غیرقابل دسترس (با mtime جدیدتر از --ruft-expiration) به همراه هر شیء غیرقابل دسترسی خواهد بود که mtime آن قدیمیتر از --ruft-expiration است اما از یک شیء غیرقابل دسترس با mtime جدیدتر از --ruft-expiration در دسترس است.
ناسازگار با --npack-unreachable، --ep-unreachable، --ack-loose-unreachable، --din-packs و همچنین هر گزینه دیگری که مستلزم --evs باشد.
--ruft-expiration=<approxidate>
--480
مقدار پیشفرض برای --1488
--360
--x-pack-size=<n>
--r-pack-keep
--ep-pack=<pack-name>
--incremental
--
--0n-empty
--rogress
--ll-progress
است با این تفاوت که نمایش گزارش پیشرفت را برای مرحله نوشتن نیز تحمیل میکند، حتی اگر از --dout استفاده شده باشد.
--ll-progress-implied
-q
--0-reuse-delta
--0-reuse-object
--ompression=<n>
--arse, --0-sparse
--hin
نکته: یک بسته نازک با حذف اشیای مورد نیاز، فرمت بایگانی بستهبندیشده را نقض میکند و بنابراین تا زمانی که خودکفا نشود توسط Git غیرقابل استفاده است. برای بازیابی ویژگی خودکفایی از git index-pack --x-thin (مراجعه به git-index-pack(1)) استفاده کنید.
--allow
--elta-base-offset
نکته: دستورات سطح بالا (Porcelain) مانند git gc (ببینید git-gc(1))، git repack (ببینید git-repack(1)) در نسخههای مدرن Git این گزینه را بهطور پیشفرض هنگام قرار دادن اشیا در فایلهای بسته مخزن شما پاس میدهند. همچنین git bundle (ببینید git-bundle(1)) هنگام ساخت باندل این کار را انجام میدهد.
--hreads=<n>
--index-version=<version>[,<offset>]
--ep-true-parents
--lter=<filter-spec>
--0-filter
--ssing=<missing-action>
فرم --ssing=error درخواست میکند که در صورت مواجهه با یک شیء گمشده، pack-objects با خطا متوقف شود. اگر مخزن یک کلون جزئی باشد، پیش از اعلام مفقودی اشیا، تلاشی برای واکشی آنها انجام خواهد شد. این اقدام پیشفرض است.
فرم --ssing=allow-any در صورت مواجهه با شیء گمشده، اجازه میدهد تا پیمایش اشیا ادامه یابد. هیچ واکشی برای شیء گمشده انجام نخواهد شد. اشیای مفقود بدون اعلام خطا از نتایج حذف خواهند شد.
فرم --ssing=allow-promisor مانند allow-any است، اما تنها برای اشیای مفقودِ مورد انتظار از سرور متهد (promisor) اجازه ادامه پیمایش را میدهد. هیچ واکشی برای شیء گمشده انجام نخواهد شد. مواجهه با شیء گمشده غیرمنتظره خطایی ایجاد خواهد کرد.
--\xclude-promisor-objects
--ep-unreachable
--ack-loose-unreachable
--npack-unreachable
--elta-islands
--0me-hash-version=<n>
نسخه پیشفرض هش نام برابر با 1 است که با در نظر گرفتن بایتهای پایانی مسیر به عنوان بیشترین وزن برای تابع هش، اولویت را به محلی بودن هش میدهد. این نسخه در تشخیص مسیرهای کوتاه و یافتن تغییر نامها در سراسر پوشهها عالی عمل میکند. با این حال، تابع هش عمدتاً به ۱۶ بایت پایانی مسیر وابسته است. اگر مسیرهای زیادی در مخزن وجود داشته باشند که ۱۶ بایت پایانی یکسانی دارند و تنها در دایرکتوری والد تفاوت دارند، این هش نام ممکن است منجر به برخوردها (collisions) و تداخلهای زیادی شود و نتایج ضعیفی به بار آورد. در حال حاضر، این نسخه هنگام نوشتن فایلهای بیتمپ دسترسپذیری با --384 الزامی است.
نسخه 2 هش نام ویژگیهای محلی مشابه نسخه 1 دارد، با این تفاوت که هر مؤلفه مسیر را بهطور جداگانه در نظر میگیرد و هشها را با یک شیفت روی هم قرار میدهد. این همچنان بایتهای پایانی مسیر را در اولویت قرار میدهد، اما همچنین بیتهای پایینتر هش را با استفاده از نام پوشههای والد «نمکسود» (salt) میکند. این روش امکان استفاده از برخی مزایای محلی نسخه 1 را فراهم میکند و در عین حال اکثر تداخلهای ناشی از ظاهر شدن فایلی با نام مشابه در دایرکتوریهای مختلف را از بین میبرد. در حال حاضر، این نسخه هنگام نوشتن فایلهای بیتمپ دسترسپذیری با --384 مجاز نیست و بهطور خودکار به نسخه 1 تغییر خواهد یافت.
--ath-walk
ناسازگار با --elta-islands. گزینه --se-bitmap-index در حضور --ath-walk نادیده گرفته میشود. گزینه --ath-walk از فرمهای --lter=<spec> زیر پشتیبانی میکند: blob:none، blob:limit=<n>، tree:0، object:type=<type> و sparse:<oid>. این انواع فیلترهای پشتیبانیشده را میتوان با فرم combine:<spec>+<spec> ترکیب کرد.
جزیرههای دلتا (DELTA ISLANDS)
در صورت امکان، pack-objects سعی میکند از دلتاهای موجود روی دیسک مجدداً استفاده کند تا از جستجوی دلتاهای جدید در لحظه جلوگیری شود. این یک بهینهسازی مهم برای پاسخ به درخواستهای واکشی (fetch) است، زیرا به این معنی است که سرور میتواند از باز کردن اکثر اشیا بهطور کامل خودداری کرده و بایتها را مستقیماً از روی دیسک ارسال کند. این بهینهسازی زمانی که یک شیء به عنوان دلتا نسبت به پایهای ذخیره شده باشد که دریافتکننده آن را ندارد (و ما هم در حال ارسال آن نیستیم) نمیتواند کار کند. در این حالت سرور دلتا را میکند و باید دلتای جدیدی پیدا کند که هزینه پردازشی بالایی دارد. بنابراین برای عملکرد بسیار مهم است که مجموعه اشیا در روابط دلتای روی دیسک با آنچه کلاینت واکشی میکند مطابقت داشته باشد.
در یک مخزن معمولی، این امر تمایل دارد بهطور خودکار کار کند. اشیا بیشتر از شاخهها و برچسبها قابل دسترس هستند و این همان چیزی است که کلاینتها واکشی میکنند. هر دلتایی که در سرور پیدا میکنیم احتمالاً میان اشیایی است که کلاینت دارد یا خواهد داشت.
اما در برخی از پیکربندیهای مخزن، ممکن است چندین گروه مرتبط اما جداگانه از سرشاخهها (ref tips) داشته باشید، به طوری که کلاینتها تمایل دارند آن گروهها را بهطور مستقل واکشی کنند. به عنوان مثال، تصور کنید که چندین انشعاب (fork) از یک مخزن را در یک مخزن اشیای مشترک میزبانی میکنید و به کلاینتها اجازه میدهید از طریق GIT_NAMESPACE یا مخازن جداگانه با استفاده از سازوکار جایگزینها (alternates) آنها را به عنوان مخازن جداگانه مشاهده کنند. یک بستهبندی مجدد سادهلوحانه ممکن است به این نتیجه برسد که دلتای بهینه برای یک شیء نسبت به پایهای است که فقط در یک فورک دیگر یافت میشود. اما هنگامی که یک کلاینت واکشی میکند، شیء پایه را نخواهد داشت و ما مجبور خواهیم شد یک دلتای جدید را در لحظه پیدا کنیم.
وضعیت مشابهی ممکن است وجود داشته باشد اگر ارجاعات زیادی خارج از refs/heads/ و refs/tags/ داشته باشید که به اشیای مرتبط اشاره میکنند (مانند refs/pull یا refs/changes که توسط برخی ارائهدهندگان میزبانی استفاده میشوند). بهطور پیشفرض، کلاینتها فقط heads و tags را واکشی میکنند و دلتاها نسبت به اشیایی که فقط در آن گروههای دیگر یافت میشوند را نمیتوان همانطور که هستند ارسال کرد.
جزیرههای دلتا این مشکل را با اجازه دادن به شما برای گروهبندی ارجاعات خود در «جزیرههای» متمایز حل میکنند. دستور Pack-objects محاسبه میکند که کدام اشیا از کدام جزیرهها قابل دسترس هستند، و از ایجاد دلتا از شیء A نسبت به پایهای که در تمام جزیرههای A's وجود ندارد خودداری میکند. این منجر به بستههای کمی بزرگتر میشود (چون برخی فرصتهای دلتا را از دست میدهیم)، اما تضمین میکند که واکشی یک جزیره مجبور نخواهد بود به دلیل عبور از مرزهای جزیره، دلتاها را در لحظه دوباره محاسبه کند.
هنگام بستهبندی مجدد با جزیرههای دلتا، پنجره دلتا تمایل دارد با کاندیداهایی که توسط پیکربندی ممنوع شدهاند پر شود. بستهبندی مجدد با یک --4200
جزیرهها از طریق گزینه pack.island پیکربندی میشوند که میتوان آن را چندین بار مشخص کرد. هر مقدار یک عبارت منظم چپچین (left-anchored) است که با نامهای ارجاع مطابقت دارد. برای مثال:
[pack] island = refs/heads/ island = refs/tags/
heads و tags را در یک جزیره قرار میدهد (که نام آن رشته خالی است؛ برای اطلاعات بیشتر در مورد نامگذاری به زیر مراجعه کنید). هر ارجاعی که با این عبارتهای منظم مطابقت نداشته باشد (مانند refs/pull/123) در هیچ جزیرهای قرار نمیگیرد. بنابراین هر شیئی که فقط از refs/pull/ قابل دسترس باشد (نه heads یا tags) کاندیدایی برای استفاده به عنوان پایه برای refs/heads/ نخواهد بود.
ارجاعات بر اساس «نام»هایشان در جزیرهها گروهبندی میشوند و دو عبارت منظم که نام یکسانی تولید میکنند در یک جزیره در نظر گرفته میشوند. نامها از عبارتهای منظم با الحاق گروههای کپچر (capture groups) عبارت منظم به همراه یک خط تیره - در بین آنها محاسبه میشوند. (و اگر گروه کپچری وجود نداشته باشد، نام برابر رشته خالی است، مانند مثال بالا). این به شما امکان میدهد تعداد دلخواهی از جزیرهها را ایجاد کنید. با این حال تنها تا ۱۴ گروه کپچر از این دست پشتیبانی میشود.
برای مثال، تصور کنید ارجاعات هر فورک را در refs/virtual/ID ذخیره میکنید که در آن ID یک شناسه عددی است. سپس میتوانید چنین پیکربندی کنید:
[pack] island = refs/virtual/([0-9]+)/heads/ island = refs/virtual/([0-9]+)/tags/ island = refs/virtual/([0-9]+)/(pull)/
این کار heads و tags را برای هر فورک در جزیره خودشان قرار میدهد (به نام "1234" یا مشابه آن)، و ارجاعات pull برای هر یک به "1234-pull" اختصاصی خود میروند.
توجه داشته باشید که ما یک جزیره واحد را برای هر عبارت منظم انتخاب میکنیم تا در آن قرار گیرد، با استفاده از ترتیب «آخرین مورد برنده است» (که به پیکربندی ویژه مخزن اجازه میدهد بر پیکربندی سراسری کاربر اولویت داشته باشد، و الی آخر).
پیکربندی (CONFIGURATION)
متغیرهای پیکربندی گوناگونی بر بستهبندی تأثیر میگذارند؛ git-config(1) را ببینید (به دنبال "pack" و "delta" بگردید).
بهویژه، فشردهسازی دلتا بر روی اشیای بزرگتر از مقدار متغیر پیکربندی core.bigFileThreshold و روی فایلهایی با ویژگی delta تنظیمشده روی false استفاده نمیشود.
همچنین ببینید (SEE ALSO)
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |