GIT-BUNDLE(1) دستورات عمومی کاربر GIT-BUNDLE(1)

git-bundle - جابجایی اشیا و ارجاعات از طریق بسته‌بندی در قالب فایل بایگانی

git bundle create [-q | --quiet | --progress]
                    [--version=<version>] <file> <git-rev-list-args>
git bundle verify [-q | --quiet] <file>
git bundle list-heads <file> [<refname>...]
git bundle unbundle [--progress] <file> [<refname>...]

ایجاد، باز کردن و کار با فایل‌های «باندل» (bundle). باندل‌ها برای انتقال «آفلاین» اشیای گیت بدون نیاز به وجود یک «سرور» فعال در سمت دیگر ارتباط شبکه استفاده می‌شوند.

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

دستورات گیت که از طریق پروتکل‌هایی مانند ssh:// و https:// داده‌ها را واکشی کرده یا به هر نحو «می‌خوانند»، می‌توانند روی فایل‌های باندل نیز عمل کنند. می‌توان یک مخزن جدید را با git-clone(1) از یک باندل کلون کرد، از git-fetch(1) برای واکشی از آن استفاده نمود، و ارجاعات موجود در آن را با git-ls-remote(1) فهرست کرد. با این حال قابلیت متناظری برای «نوشتن» وجود ندارد، یعنی دستور git push بر روی یک باندل پشتیبانی نمی‌شود.

باندل‌ها همان فایل‌های .pack هستند (نگاه کنید به git-pack-objects(1)) که دارای یک سرآیند (header) می‌باشند که نشان می‌دهد چه ارجاعاتی در درون باندل قرار دارند.

مانند خود قالب بایگانی فشرده (packed archive)، باندل‌ها می‌توانند هم خودکفا (self-contained) باشند و هم با استفاده از استثناها (exclusions) ایجاد شوند. بخش «پیش‌نیازهای اشیا» در ادامه را ببینید.

باندل‌هایی که با استفاده از استثناهای بازبینی (revision exclusions) ایجاد می‌شوند، «بسته‌های نازک» (thin packs) هستند که با استفاده از گزینه --thin در دستور git-pack-objects(1) ساخته می‌شوند، و با استفاده از گزینه --fix-thin در git-index-pack(1) از حالت بسته‌بندی خارج (unbundle) می‌گردند.

هیچ گزینه‌ای برای ایجاد یک «بسته ضخیم» (thick pack) در زمان استفاده از استثناهای بازبینی وجود ندارد، و کاربران نباید نگران تفاوت آن‌ها باشند. با استفاده از «بسته‌های نازک»، باندل‌های ایجادشده با استثناها از نظر حجم کوچک‌تر هستند. اینکه آن‌ها در پشت صحنه «نازک» هستند صرفاً به عنوان یک نکته جالب و به عنوان ارجاعی به سایر مستندات در اینجا ذکر شده است.

برای جزئیات بیشتر به gitformat-bundle(5) و برای توضیحات بیشتر درباره «بسته نازک» به gitformat-pack(5) مراجعه کنید.

create [options] <file> <git-rev-list-args>

برای ایجاد یک باندل با نام file استفاده می‌شود. این دستور به آرگومان‌های <git-rev-list-args> برای تعریف محتوای باندل نیاز دارد. options شامل گزینه‌های خاص زیردستور git bundle create است. اگر file برابر با - باشد، باندل در خروجی استاندارد (stdout) نوشته می‌شود.

verify <file>

برای بررسی معتبر بودن یک فایل باندل و امکان اعمال تمیز و بدون خطای آن روی مخزن فعلی استفاده می‌شود. این بررسی شامل اعتبارسنجی خود قالب باندل و همچنین اطمینان از وجود داشتن و پیوند کامل داشتن کامیت‌های پیش‌نیاز در مخزن فعلی است. سپس، git bundle فهرستی از کامیت‌های ناموجود (در صورت وجود) را چاپ می‌کند. در نهایت، اطلاعات مربوط به قابلیت‌های اضافی مانند «فیلتر اشیا» (object filter) چاپ می‌شود. برای اطلاعات بیشتر بخش «قابلیت‌ها» در gitformat-bundle(5) را ببینید. کد خروج در صورت موفقیت صفر است، اما اگر فایل باندل نامعتبر باشد غیرصفر خواهد بود. اگر file برابر با - باشد، باندل از ورودی استاندارد (stdin) خوانده می‌شود.

list-heads <file>

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

unbundle <file>

اشیای موجود در باندل را به git index-pack برای ذخیره‌سازی در مخزن ارسال می‌کند، سپس نام‌های تمام ارجاعات تعریف‌شده را چاپ می‌نماید. در صورت ارائه فهرستی از ارجاعات، تنها ارجاعات مطابق با آن فهرست چاپ می‌شوند. این دستور در واقع یک دستور لوله‌کشی (plumbing) است که تنها با هدف فراخوانی توسط git fetch در نظر گرفته شده است. اگر file برابر با - باشد، باندل از ورودی استاندارد (stdin) خوانده می‌شود.

<git-rev-list-args>

فهرستی از آرگومان‌ها، قابل پذیرش توسط git rev-parse و git rev-list (و حاوی یک ارجاع نام‌گذاری‌شده؛ بخش «مشخص کردن ارجاعات» در ادامه را ببینید)، که اشیا و ارجاعات خاص را برای انتقال تعیین می‌کند. به عنوان مثال، master~10..master باعث می‌شود که ارجاع فعلی master به همراه تمام اشیای اضافه شده از زمان دهمین کامیت نیاکان آن بسته‌بندی شوند. هیچ محدودیت صریحی برای تعداد ارجاعات و اشیایی که می‌توانند بسته‌بندی شوند وجود ندارد.

[<refname>...]

فهرستی از ارجاعات که برای محدود کردن ارجاعات گزارش‌شده به عنوان ارجاعات موجود استفاده می‌شود. این مورد عمدتاً برای استفاده git fetch است که انتظار دارد تنها ارجاعات درخواست‌شده را دریافت کند و نه الزاماً هر آنچه در بسته وجود دارد (در این حالت، git bundle مشابه git fetch-pack عمل می‌کند).

--progress

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

--version=<version>

نسخه باندل را مشخص می‌کند. نسخه 2 قالب قدیمی‌تر است و تنها برای مخازن SHA-1 قابل استفاده است؛ نسخه جدیدتر 3 شامل قابلیت‌هایی است که امکان استفاده از افزونه‌ها را می‌دهد. پیش‌فرض، قدیمی‌ترین قالب پشتیبانی‌شده بر اساس الگوریتم هش مورد استفاده است.

-q, --quiet

این فلگ باعث می‌شود دستور وضعیت پیشرفت خود را روی جریان خطای استاندارد گزارش نکند.

بازبینی‌ها (revisions) برای بسته‌بندی در یک باندل باید همراه با نام ارجاع باشند. به عنوان روش جایگزین می‌توان از --all برای بسته‌بندی تمام ارجاعات استفاده کرد.

می‌توان بیش از یک ارجاع را بسته‌بندی کرد و بیش از یک مجموعه از اشیای پیش‌نیاز را مشخص نمود. اشیایی که بسته‌بندی می‌شوند آن‌هایی هستند که در اجتماع پیش‌نیازها قرار ندارند.

دستور git bundle create نام ارجاعات را با استفاده از همان قوانین git rev-parse --abbrev-ref=loose برای شما حل‌وفصل می‌کند. هر پیش‌نیاز می‌تواند به طور صریح (مانند ^master~10) یا ضمنی (مانند master~10..master یا --since=10.days.ago master) مشخص شود.

تمام این موارد ساده مجاز هستند (با فرض اینکه شاخه‌های "master" و "next" را داریم):

$ git bundle create master.bundle master
$ echo master | git bundle create master.bundle --stdin
$ git bundle create master-and-next.bundle master next
$ (echo master; echo next) | git bundle create master-and-next.bundle --stdin

و همچنین موارد زیر (و نمونه‌های مشابه بدون --stdin):

$ git bundle create recent-master.bundle master~10..master
$ git bundle create recent-updates.bundle master~10..master next~5..next

نام یک بازبینی یا بازه‌ای که سمت راست آن نتواند به یک ارجاع حل‌وفصل شود، پذیرفته نمی‌شود:

$ git bundle create HEAD.bundle $(git rev-parse HEAD)
fatal: Refusing to create empty bundle.
$ git bundle create master-yesterday.bundle master~10..master~5
fatal: Refusing to create empty bundle.

هنگام ساخت باندل‌ها، امکان ایجاد یک باندل خودکفا وجود دارد که می‌تواند در مخزنی بدون هیچ تاریخچه مشترکی باز شود، و همچنین می‌توان بازبینی‌های منفی ارائه داد تا اشیای مورد نیاز در بخش‌های قبلی تاریخچه مستثنی شوند.

دادن یک بازبینی مانند new به git bundle create فایلی از نوع باندل تولید می‌کند که حاوی تمام اشیای قابل دسترسی از بازبینی new است. آن باندل می‌تواند در هر مخزنی باز شود تا تاریخچه کاملی که به بازبینی new منتهی می‌شود به دست آید:

$ git bundle create full.bundle new

یک بازه بازبینی مانند old..new فایلی از نوع باندل تولید می‌کند که برای باز شدن باندل نیازمند وجود بازبینی old (و هر شیء قابل دسترسی از آن) خواهد بود:

$ git bundle create full.bundle old..new

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

احتیاط کردن و گنجاندن اشیایی در فایل باندل که هم‌اکنون در مقصد وجود دارند اشکالی ندارد، زیرا هنگام باز کردن بسته در مقصد نادیده گرفته می‌شوند.

اگر می‌خواهید همان مجموعه ارجاعاتی را فراهم کنید که کلون مستقیم از مخزن مبدا دریافت می‌کند، از --branches --tags برای <git-rev-list-args> استفاده کنید.

دستور git bundle verify می‌تواند برای بررسی اینکه آیا مخزن گیرنده شما کامیت‌های پیش‌نیاز لازم برای یک باندل را دارد یا خیر، استفاده شود.

ما دو حالت را بررسی خواهیم کرد:

1.تهیه یک پشتیبان کامل از یک مخزن
2.انتقال تاریخچه یک مخزن به ماشینی دیگر هنگامی که دو ماشین ارتباط مستقیم ندارند

ابتدا یک پشتیبان کامل از مخزن را در نظر می‌گیریم. دستور زیر یک نسخه پشتیبان کامل از مخزن تهیه می‌کند به این معنا که تمام ارجاعات در باندل گنجانده می‌شوند:

$ git bundle create backup.bundle --all

اما مجدداً توجه داشته باشید که این پشتیبان فقط برای ارجاعات است، یعنی شما فقط ارجاعات و کامیت‌های قابل دسترسی از آن ارجاعات را شامل خواهید کرد. سایر وضعیت‌های محلی مانند محتوای ایندکس، درخت کاری (working tree)، استش (stash)، پیکربندی‌های خاص هر مخزن، هوک‌ها و غیره را شامل نخواهید کرد.

بعداً می‌توانید آن مخزن را برای نمونه با استفاده از git-clone(1) بازیابی کنید:

$ git clone backup.bundle <new directory>

برای مثال بعد، فرض کنید می‌خواهید تاریخچه را از یک مخزن R1 روی ماشین A به مخزن دیگری به نام R2 روی ماشین B منتقل کنید. به هر دلیلی، ارتباط مستقیم بین A و B مجاز نیست، اما می‌توانیم داده‌ها را از طریق سازوکاری (سی‌دی، ایمیل، و غیره) از A به B منتقل کنیم. ما می‌خواهیم R2 را با تغییرات ایجادشده روی شاخه master در R1 به‌روز کنیم.

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

machineA$ cd R1
machineA$ git bundle create file.bundle master
machineA$ git tag -f lastR2bundle master

سپس فایل file.bundle را به ماشین مقصد B منتقل می‌کنید. از آنجا که این باندل برای استخراج نیازی به هیچ شیء موجودی ندارد، می‌توانید با کلون کردن از آن یک مخزن جدید در ماشین B ایجاد کنید:

machineB$ git clone -b master /home/me/tmp/file.bundle R2

این کار یک کنترل از راه دور (remote) به نام "origin" در مخزن حاصل تعریف می‌کند که به شما امکان می‌دهد از باندل واکشی (fetch) و دریافت (pull) کنید. فایل $GIT_DIR/config در R2 ورودی مشابه این خواهد داشت:

[remote "origin"]
    url = /home/me/tmp/file.bundle
    fetch = refs/heads/*:refs/remotes/origin/*

برای به‌روزرسانی مخزن حاصل، می‌توانید پس از جایگزین کردن باندل ذخیره‌شده در /home/me/tmp/file.bundle با به‌روزرسانی‌های افزایشی، عملیات fetch یا pull را انجام دهید.

پس از انجام کارهای بیشتر در مخزن اصلی، می‌توانید یک باندل افزایشی برای به‌روزرسانی مخزن دیگر ایجاد کنید:

machineA$ cd R1
machineA$ git bundle create file.bundle lastR2bundle..master
machineA$ git tag -f lastR2bundle master

سپس باندل را به ماشین دیگر منتقل می‌کنید تا جایگزین /home/me/tmp/file.bundle شود، و از آن pull می‌کنید.

machineB$ cd R2
machineB$ git pull

اگر بدانید مخزن گیرنده مورد نظر تا چه کامیتی اشیای لازم را در خود دارد، می‌توانید از آن آگاهی برای تعیین پیش‌نیازها استفاده کنید و یک نقطه قطع برای محدود کردن بازبینی‌ها و اشیایی که در باندل حاصل قرار می‌گیرند تعیین نمایید. مثال قبلی از تگ lastR2bundle برای این منظور استفاده کرد، اما شما می‌توانید از هر گزینه دیگری که به دستور git-log(1) می‌دادید استفاده کنید. در اینجا مثال‌های بیشتری آمده است:

می‌توانید از تگی استفاده کنید که در هر دو وجود دارد:

$ git bundle create mybundle v1.0.0..master

می‌توانید از پیش‌نیازی بر اساس زمان استفاده کنید:

$ git bundle create mybundle --since=10.days master

می‌توانید از تعداد کامیت‌ها استفاده کنید:

$ git bundle create mybundle -10 master

می‌توانید دستور git-bundle verify را اجرا کنید تا ببینید آیا می‌توانید از باندلی که با یک پیش‌نیاز ایجاد شده است استخراج نمایید یا خیر:

$ git bundle verify mybundle

این کار کامیت‌هایی را که برای استخراج از باندل باید داشته باشید فهرست می‌کند و اگر آن‌ها را نداشته باشید با خطا متوقف می‌شود.

یک باندل از دیدگاه مخزن گیرنده، دقیقاً مانند یک مخزن معمولی است که از آن واکشی (fetch) یا دریافت (pull) می‌کند. برای نمونه، می‌توانید ارجاعات را هنگام واکشی نقشه‌برداری کنید:

$ git fetch mybundle master:localRef

همچنین می‌توانید ببینید چه ارجاعاتی ارائه می‌دهد:

$ git ls-remote mybundle

یک روش ناشیانه برای تهیه نسخه پشتیبان کامل از یک مخزن، استفاده از دستوری مانند cp -r <repo> <destination> است. استفاده از این روش توصیه نمی‌شود، زیرا ممکن است در حین عملیات کپی در مخزن نوشته شود. در نتیجه ممکن است برخی از فایل‌ها در <destination> دچار خرابی شوند.

به همین دلیل توصیه می‌شود برای تهیه نسخه پشتیبان از مخزن، از ابزارهای گیت استفاده کنید؛ چه با این دستور یا به عنوان مثال با git-clone(1). اما در نظر داشته باشید که این ابزارها برای پشتیبان‌گیری از وضعیت‌هایی به جز ارجاعات و کامیت‌ها کمکی به شما نخواهند کرد. به عبارت دیگر، آن‌ها در تهیه پشتیبان از محتوای ایندکس، درخت کاری، استش، پیکربندی خاص هر مخزن، هوک‌ها و غیره به شما کمکی نمی‌کنند.

همچنین برای بررسی مشکلات مربوط به همگام‌سازی فایل‌ها میان سیستم‌ها، به gitfaq(7)، بخش "TRANSFERS" مراجعه کنید.

به gitformat-bundle(5) مراجعه کنید.

gitformat-bundle(5), git-clone(1), git-fetch(1), git-pack-objects(1), gitformat-pack(5)

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

2026-06-29 Git 2.55.0