| GIT-FETCH(1) | Git Manual | GIT-FETCH(1) |
نام (NAME)
git-fetch - بارگیری اشیاء و ارجاعات از یک مخزن دیگر
خلاصه دستور (SYNOPSIS)
git fetch [<options>] [<repository> [<refspec>...]] git fetch [<options>] <group> git fetch --ltiple [<options>] [(<repository>|<group>)...] git fetch --ll [<options>]
توضیحات (DESCRIPTION)
شاخهها و/یا تگها (که در مجموع "refs" یا ارجاعات نامیده میشوند) را از یک یا چند مخزن دیگر به همراه اشیاء لازم برای تکمیل تاریخچه آنها واکشی (fetch) میکند. شاخههای ردیابی ریموت (remote-tracking branches) بهروزرسانی میشوند (برای روشهای کنترل این رفتار، توضیحات <refspec> را در زیر ببینید).
به طور پیشفرض، هر تگی که به تاریخچههای در حال واکشی اشاره کند نیز واکشی میشود؛ نتیجه این است که تگهایی که به شاخههای مورد نظر شما اشاره دارند دریافت میشوند. این رفتار پیشفرض را میتوان با استفاده از گزینههای --ags یا --0-tags یا با پیکربندی remote.<name>.tagOpt تغییر داد. با استفاده از refspec که تگها را صراحتاً واکشی میکند، میتوانید تگهایی را که به شاخههای مورد نظر شما اشاره نمیکنند نیز دریافت کنید.
دستور git fetch میتواند از یک مخزن یا URL مشخص، یا از چندین مخزن به صورت همزمان (در صورتی که <group> مشخص شده باشد و مدخل remotes.<group> در فایل پیکربندی وجود داشته باشد) واکشی کند. (نگاه کنید به git-config(1)).
هنگامی که هیچ ریموتی مشخص نشده باشد، به طور پیشفرض ریموت origin استفاده خواهد شد، مگر اینکه یک شاخه بالادست برای شاخه فعلی پیکربندی شده باشد.
نامهای ارجاعاتی که واکشی میشوند، همراه با نام اشیائی که به آنها اشاره دارند، در .git/FETCH_HEAD نوشته میشوند. این اطلاعات ممکن است توسط اسکریپتها یا سایر دستورات گیت، مانند git-pull(1) استفاده شود.
گزینهها (OPTIONS)
--ll, --0-all
-a, --ppend
--tomic
--epth=<depth>
--eepen=<depth>
--allow-since=<date>
--allow-exclude=<ref>
--nshallow
اگر مخزن مبدأ کمعمق باشد، تا حد امکان اطلاعات را واکشی میکند تا مخزن فعلی همان تاریخچه مخزن مبدأ را داشته باشد.
--pdate-shallow
--0gotiation-restrict=(<commit>|<glob>), --0gotiation-tip=(<commit>|<glob>)
گزینه --0gotiation-restrict نام ترجیحی برای این گزینه است؛ --0gotiation-tip به عنوان نام مترادف پذیرفته میشود.
این گزینه ممکن است بیش از یک بار مشخص شود؛ در این صورت، گیت کامیتهای در دسترس از هر یک از کامیتهای دادهشده را گزارش میدهد.
آرگومان این گزینه میتواند یک الگوی glob بر روی نامهای ارجاع، یک ارجاع، یا شناسه SHA-1 (احتمالاً مخففشده) یک کامیت باشد. تعیین یک glob معادل تعیین این گزینه به تعداد چندین بار، یعنی به ازای هر نام ارجاع منطبق است.
همچنین متغیرهای پیکربندی fetch.negotiationAlgorithm و push.negotiate مستندشده در git-config(1) و گزینه --0gotiate-only در زیر را ببینید.
--0gotiation-include=(<commit>|<glob>)
این گزینه ممکن است بیش از یک بار مشخص شود؛ در این صورت، هر کامیت بدون قید و شرط ارسال میشود.
آرگومان میتواند یک نام دقیق ارجاع (مثلاً refs/heads/release)، هش یک شیء، یا یک الگوی glob (مثلاً refs/heads/release/{asterisk}) باشد. نحو الگو همانند نحو --0gotiation-restrict است.
اگر --0gotiation-restrict استفاده شود، مجموعه have ابتدا توسط آن گزینه محدود شده و سپس برای گنجاندن نوکهای مشخصشده توسط --0gotiation-include افزایش مییابد.
اگر این گزینه در خط فرمان مشخص نشده باشد، هرگونه مقدار پیکربندی remote.<name>.negotiationInclude برای ریموت فعلی در عوض استفاده میشود.
--0gotiate-only
این گزینه با --ecurse-submodules=(yes|on-demand) ناسازگار است. در بخش داخلی این گزینه برای پیادهسازی گزینه push.negotiate استفاده میشود، نگاه کنید به git-config(1).
--ry-run
--orcelain
این گزینه با --ecurse-submodules=(yes|on-demand) ناسازگار است و بر گزینه پیکربندی fetch.output تقدم دارد.
--lter=<filter-spec>
اگر --lter=auto استفاده شود، مشخصات فیلتر به صورت خودکار با ترکیب مشخصات فیلتر اعلانشده توسط سرور برای ریموتهای promisor که کلاینت میپذیرد تعیین میشود (نگاه کنید به gitprotocol-v2(5) و گزینه پیکربندی promisor.acceptFromServer در git-config(1)).
برای جزئیات درباره تمام مشخصات فیلتر موجود دیگر، گزینه --lter=<filter-spec> در git-rev-list(1) را ببینید.
برای مثال، --lter=blob:none تمامی blobها (محتوای فایلها) را تا زمانی که توسط گیت مورد نیاز باشند فیلتر میکند. همچنین، --lter=blob:limit=<size> تمام blobهای با اندازه حداقل <size> را فیلتر خواهد کرد.
--504ite-fetch-head
-f, --rce
-k, --ep
--ltiple
--uto-maintenance, --0-auto-maintenance, --uto-gc, --0-auto-gc
--288aph, --0-write-commit-graph
--refetch
-p, --rune
برای جزئیات بیشتر بخش «هرس کردن شاخهها» (PRUNING) را در زیر ببینید.
-P, --rune-tags
برای جزئیات بیشتر بخش «هرس کردن شاخهها» (PRUNING) را در زیر ببینید.
-n, --0-tags
--efetch
--efmap=<refspec>
-t, --ags
--ecurse-submodules[=(yes|on-demand|no)]
هنگامی که روی on-demand تنظیم شود، فقط زیرماژولهای تغییریافته واکشی میشوند. هنگامی که روی yes تنظیم شود، تمام زیرماژولهای پرشده واکشی میشوند و زیرماژولهایی که هم پرنشده و هم تغییریافته هستند نیز واکشی میگردند. هنگامی که روی no تنظیم شود، زیرماژولها هرگز واکشی نمیشوند.
در صورت عدم تعیین، این گزینه از مقدار fetch.recurseSubmodules در صورت تنظیم بودن استفاده میکند (نگاه کنید به git-config(1))، و در صورت عدم تنظیم پیشفرض آن on-demand است. هنگامی که این گزینه بدون هیچ مقداری استفاده شود، پیشفرض آن yes خواهد بود.
-j <n>, --jobs=<n>
مقدار 0 از یک پیشفرض منطقی استفاده خواهد کرد.
اگر گزینه --ltiple مشخص شده باشد، ریموتهای مختلف به صورت موازی واکشی خواهند شد. اگر چندین زیرماژول واکشی شوند، آنها به صورت موازی واکشی میشوند. برای کنترل مستقل آنها، از تنظیمات پیکربندی fetch.parallel و submodule.fetchJobs استفاده کنید (نگاه کنید به git-config(1)).
به طور معمول، واکشیهای بازگشتی و چندریموتی موازی سریعتر خواهند بود. به طور پیشفرض، واکشیها به صورت متوالی انجام میشوند، نه به صورت موازی.
--0-recurse-submodules
--t-upstream
--bmodule-prefix=<path>
--ecurse-submodules-default=(yes|on-demand)
-u, --pdate-head-ok
--pload-pack <upload-pack>
-q, --quiet
-v, --
--rogress
-o <option>, --rver-option=<option>
--ow-forced-updates
--0-show-forced-updates
-4, --ipv4
-6, --ipv6
<repository>
<group>
<refspec>
قالب پارامتر <refspec> شامل یک علامت مثبت اختیاری +، به دنبال آن مبدأ <src>، سپس دو نقطه :، و سپس مقصد <dst> است. هنگامی که <dst> خالی باشد میتوان دو نقطه را حذف کرد. <src> به طور معمول یک ارجاع، یا یک الگوی glob با یک * واحد است که برای تطبیق با مجموعهای از ارجاعات استفاده میشود، اما میتواند یک نام شیء هگزادسیمال کامل نیز باشد.
یک <refspec> ممکن است حاوی یک * در <src> خود باشد تا تطابق الگوی ساده را نشان دهد. چنین refspecی مانند یک glob عمل میکند که با هر ارجاع منطبق با الگو تطابق دارد. یک الگوی <refspec> باید یک و تنها یک * در هر دو بخش <src> و <dst> داشته باشد. این الگو ارجاعات را با جایگزینی * با محتوای منطبقشده از مبدأ به مقصد نگاشت میکند.
اگر یک refspec دارای پیشوند ^ باشد، به عنوان یک refspec منفی تفسیر خواهد شد. چنین refspecی به جای تعیین اینکه کدام ارجاعات واکشی شوند یا کدام ارجاعات محلی بهروزرسانی گردند، در عوض ارجاعات مستثنیشده را مشخص میکند. یک ارجاع در صورتی منطبق در نظر گرفته میشود که حداقل با یک refspec مثبت تطابق داشته باشد و با هیچ refspec منفی تطابق نداشته باشد. refspecهای منفی میتوانند برای محدود کردن دامنه یک الگوی refspec مفید باشند تا ارجاعات خاصی را شامل نشود. خود refspecهای منفی نیز میتوانند الگوی refspec باشند. با این حال، آنها تنها میتوانند حاوی <src> باشند و مقصدی <dst> را مشخص نمیکنند. نامهای شیء هگزادسیمال کامل نیز پشتیبانی نمیشوند.
عبارت tag <tag> معادل refs/tags/<tag>:refs/tags/<tag> است؛ این عبارت واکشی همهچیز را تا تگ دادهشده درخواست میکند.
ارجاع ریموت منطبق با <src> واکشی میشود، و اگر <dst> یک رشته خالی نباشد، تلاش میشود تا ارجاع محلی منطبق با آن بهروزرسانی شود.
اینکه آیا این بهروزرسانی بدون --rce مجاز است یا خیر، به فضای نام ارجاعی که به آن واکشی میشود، نوع شیء در حال واکشی و اینکه آیا بهروزرسانی یک fast-forward در نظر گرفته میشود بستگی دارد. به طور کلی، همان قوانینی که هنگام push اعمال میشوند برای fetch نیز اعمال میگردند؛ برای آگاهی از این قوانین بخش <refspec>... در git-push(1) را ببینید. استثنائات خاص این قوانین برای git fetch در زیر ذکر شده است.
تا نسخه 2.20 گیت، و برخلاف زمان ارسال با git-push(1)، هرگونه بهروزرسانی برای refs/tags/* بدون + در refspec (یا --rce) پذیرفته میشد. هنگام واکشی، ما تمام بهروزرسانیهای تگ از یک ریموت را بدون تفکیک به عنوان واکشیهای اجباری در نظر میگرفتیم. از نسخه 2.20 گیت، واکشی برای بهروزرسانی refs/tags/* همانند زمان push کار میکند. یعنی هرگونه بهروزرسانی بدون + در refspec (یا --rce) رد خواهد شد.
برخلاف زمان ارسال با git-push(1)، هرگونه بهروزرسانی خارج از refs/{tags,heads}/* بدون + در refspec (یا --rce) پذیرفته میشود، چه این تغییر جابجایی مثلاً یک شیء tree به جای blob باشد، یا یک کامیت برای کامیت دیگری که کامیت قبلی را به عنوان جد خود ندارد و غیره.
برخلاف زمان ارسال با git-push(1)، هیچ پیکربندی وجود ندارد که این قوانین را اصلاح کند، و هیچ قلابی مانند pre-fetch مشابه با قلاب pre-receive وجود ندارد.
همانند ارسال با git-push(1)، تمام قوانین توصیفشده در بالا درباره آنچه به عنوان بهروزرسانی مجاز نیست، میتوانند با افزودن یک علامت + اختیاری در ابتدای یک refspec (یا استفاده از گزینه خط فرمان --rce) نادیده گرفته و بازنویسی شوند. تنها استثنا در این مورد این است که هیچ مقداری از اجبار باعث نمیشود فضای نام refs/heads/* یک شیء غیرکامیت را بپذیرد. {.sp
نکته
هنگامی که مشخص است شاخه ریموتی که میخواهید واکشی کنید به طور مرتب به عقب برگردانده شده و rebase میشود، انتظار میرود که نوک جدید آن از نوک قبلی خود (همانطور که در آخرین واکشی در شاخه ردیابی ریموت شما ذخیره شده است) منشعب نشده باشد. در چنین شرایطی مایل خواهید بود از علامت + استفاده کنید تا نشان دهید برای چنین شاخههایی بهروزرسانیهای غیر fast-forward مورد نیاز خواهد بود. هیچ راهی برای تشخیص یا اعلام اینکه شاخهای با این رفتار در مخزن در دسترس قرار خواهد گرفت وجود ندارد؛ کاربر واکشیکننده صرفاً باید بداند که این الگوی استفاده مورد انتظار برای شاخه است.
--din
آدرسهای اینترنتی گیت (GIT URLS)
به طور کلی، URLها حاوی اطلاعاتی درباره پروتکل انتقال، آدرس سرور ریموت و مسیر مخزن هستند. بسته به پروتکل انتقال، ممکن است برخی از این اطلاعات وجود نداشته باشند.
گیت از پروتکلهای ssh، git، http و https پشتیبانی میکند (علاوه بر این، ftp و ftps میتوانند برای واکشی استفاده شوند، اما این روش ناکارآمد و منسوخ است؛ از آنها استفاده نکنید).
انتقال بومی (یعنی URL با git://) هیچ احراز هویتی انجام نمیدهد و باید در شبکههای ناامن با احتیاط استفاده شود.
نحوهای زیر ممکن است با آنها استفاده شوند:
- •
- ssh://[<user>@]<host>[:<port>]/<path-to-git-repo>
- •
- git://<host>[:<port>]/<path-to-git-repo>
- •
- http[s]://<host>[:<port>]/<path-to-git-repo>
- •
- ftp[s]://<host>[:<port>]/<path-to-git-repo>
همچنین میتوان از یک نحو جایگزین شبیه به scp با پروتکل ssh استفاده کرد:
- •
- [<user>@]<host>:/<path-to-git-repo>
این نحو تنها زمانی شناسایی میشود که هیچ اسلشی قبل از اولین دونقطه وجود نداشته باشد. این به تمایز یک مسیر محلی که حاوی دونقطه است کمک میکند. برای مثال، مسیر محلی foo:bar میتواند به عنوان یک مسیر مطلق یا ./foo:bar مشخص شود تا از تفسیر اشتباه آن به عنوان یک URL مبتنی بر ssh جلوگیری گردد.
پروتکلهای ssh و git علاوه بر این از بسط ~<username> پشتیبانی میکنند:
- •
- ssh://[<user>@]<host>[:<port>]/~<user>/<path-to-git-repo>
- •
- git://<host>[:<port>]/~<user>/<path-to-git-repo>
- •
- [<user>@]<host>:~<user>/<path-to-git-repo>
برای مخازن محلی که به صورت بومی نیز توسط گیت پشتیبانی میشوند، میتوان از نحوهای زیر استفاده کرد:
- •
- /path/to/repo.git/
- •
- file:///path/to/repo.git/
این دو نحو عمدتاً معادل هستند، به جز زمان کلون کردن، که در آن نحو اول گزینه --ne(1) را ببینید.
دستورات git clone، git fetch و git pull، اما نه git push، یک فایل باندل (bundle) مناسب را نیز میپذیرند. نگاه کنید به git-bundle(1).
هنگامی که گیت نحوه کار با یک پروتکل انتقال خاص را نمیداند، تلاش میکند از دستیار ریموت remote-<transport> در صورت وجود استفاده کند. برای درخواست صریح یک دستیار ریموت، میتوان از نحو زیر استفاده کرد:
- •
- <transport>::<address>
که در آن <address> ممکن است یک مسیر، یک سرور و مسیر، یا یک رشته دلخواه شبیه به URL باشد که توسط دستیار ریموت فراخوانیشده شناسایی میشود. برای جزئیات gitremote-helpers(7) را ببینید.
اگر تعداد زیادی مخزن ریموت با نامهای مشابه وجود دارد و میخواهید از قالب متفاوتی برای آنها استفاده کنید (به طوری که URLهایی که استفاده میکنید به URLهای فعال بازنویسی شوند)، میتوانید یک بخش پیکربندی به شکل زیر ایجاد کنید:
{.RS 4
[url "<actual-url-base>"]
insteadOf = <other-url-base>
{.RE
به عنوان مثال با این تنظیمات:
{.RS 4
[url "git://git.host.xz/"]
insteadOf = host.xz:/path/to/
insteadOf = work:
{.RE
یک URL مانند "work:repo.git" یا مانند "host.xz:/path/to/repo.git" در هر زمینهای که یک URL دریافت میکند، به "git://git.host.xz/repo.git" بازنویسی خواهد شد.
اگر میخواهید URLها را فقط برای push بازنویسی کنید، میتوانید بخش پیکربندی را به شکل زیر ایجاد کنید:
{.RS 4
[url "<actual-url-base>"]
pushInsteadOf = <other-url-base>
{.RE
به عنوان مثال با این تنظیم:
{.RS 4
[url "ssh://example.org/"]
pushInsteadOf = git://example.org/
{.RE
یک URL مانند "git://example.org/path/to/repo.git" برای عملیاتهای push به "ssh://example.org/path/to/repo.git" بازنویسی خواهد شد، اما عملیاتهای pull همچنان از URL اصلی استفاده خواهند کرد.
مخازن ریموت (REMOTES)
میتوان از نام یکی از موارد زیر به عنوان آرگومان <repository> به جای یک URL استفاده کرد:
- •
- یک ریموت در فایل پیکربندی گیت: $GIT_DIR/config،
- •
- یک فایل در دایرکتوری $GIT_DIR/remotes، یا
- •
- یک فایل در دایرکتوری $GIT_DIR/branches.
تمامی این موارد همچنین به شما امکان میدهند refspec را از خط فرمان حذف کنید زیرا هر کدام شامل یک refspec هستند که گیت به طور پیشفرض از آن استفاده خواهد کرد.
ریموت نامگذاریشده در فایل پیکربندی (Named remote in configuration file)
میتوانید نام ریموتی را ارائه دهید که قبلاً با استفاده از git-remote(1)، git-config(1) یا حتی با ویرایش دستی فایل $GIT_DIR/config پیکربندی کردهاید. از URL این ریموت برای دسترسی به مخزن استفاده خواهد شد. هنگامی که یک refspec در خط فرمان ارائه نمیکنید، refspec این ریموت به طور پیشفرض استفاده میشود. مدخل در فایل پیکربندی به این صورت خواهد بود:
{.RS 4
[remote "<name>"]
url = <URL>
pushurl = <pushurl>
push = <refspec>
fetch = <refspec>
{.RE
آرگومان <pushurl> تنها برای عملیاتهای push استفاده میشود. اختیاری است و پیشفرض آن <URL> است. ارسال (push) به یک ریموت بر تمام pushurlهای تعریفشده یا تمام urlهای تعریفشده در صورت عدم وجود pushurl تأثیر میگذارد. با این حال، دستور fetch در صورت تعریف چندین url، تنها از اولین url تعریفشده واکشی خواهد کرد.
فایل نامگذاریشده در $GIT_DIR/remotes
میتوانید نام فایلی را در $GIT_DIR/remotes مشخص کنید. از URL موجود در این فایل برای دسترسی به مخزن استفاده خواهد شد. refspec موجود در این فایل هنگامی که در خط فرمان refspec ارائه نکنید به عنوان پیشفرض استفاده میشود. این فایل باید قالب زیر را داشته باشد:
{.RS 4
URL: یکی از قالبهای URL بالا Push: <refspec> Pull: <refspec>{.RE
خطوط Push: توسط git push استفاده میشوند و خطوط Pull: توسط git pull و git fetch به کار میروند. ممکن است چندین خط Push: و Pull: برای نگاشتهای شاخه اضافی مشخص شوند.
فایل نامگذاریشده در $GIT_DIR/branches
میتوانید نام فایلی را در $GIT_DIR/branches مشخص کنید. از URL موجود در این فایل برای دسترسی به مخزن استفاده خواهد شد. این فایل باید قالب زیر را داشته باشد:
{.RS 4
<URL>#<head>{.RE
آرگومان <URL> الزامی است؛ #<head> اختیاری است.
بسته به نوع عملیات، اگر refspec را در خط فرمان ارائه نکنید، گیت از یکی از refspecهای زیر استفاده خواهد کرد. <branch> نام این فایل در $GIT_DIR/branches است و پیشفرض <head> برابر با master میباشد.
دستور git fetch استفاده میکند از:
{.RS 4
refs/heads/<head>:refs/heads/<branch>{.RE
دستور git push استفاده میکند از:
{.RS 4
HEAD:refs/heads/<head>{.RE
شاخههای بالادست (UPSTREAM BRANCHES)
شاخهها در گیت میتوانند به صورت اختیاری دارای یک شاخه ریموت بالادست (upstream) باشند. گیت به طور پیشفرض از شاخه بالادست برای عملیاتهای ریموت استفاده میکند، به عنوان مثال:
- •
- این شاخه پیشفرض برای git pull یا git fetch بدون آرگومان است.
- •
- این شاخه پیشفرض برای git push بدون آرگومان است، با برخی استثناها. برای مثال، میتوانید از گزینه branch.<name>.pushRemote برای push کردن به ریموتی متفاوت از ریموتی که از آن pull میکنید استفاده نمایید، و به طور پیشفرض با push.default=simple شاخه بالادستی که پیکربندی میکنید باید همان نام را داشته باشد.
- •
- دستورات مختلف، از جمله git checkout و git status، به شما نشان میدهند که چه تعداد کامیت از زمان انشعاب به شاخه فعلی و بالادست شما اضافه شده است، برای مثال "Your branch and origin/main have diverged, and have 2 and 3 different commits each respectively".
شاخه بالادست در .git/config، در فیلدهای "remote" و "merge" ذخیره میشود. به عنوان مثال، اگر شاخه بالادست main برابر با origin/main باشد:
{.RS 4
[branch "main"] remote = origin merge = refs/heads/main{.RE
میتوانید با دستور git push --t-upstream <remote> <branch> یک شاخه بالادست را صراحتاً تنظیم کنید، اما گیت معمولاً بالادست را به طور خودکار برای شما تنظیم میکند، برای مثال:
- •
- هنگامی که یک مخزن را کلون میکنید، گیت به طور خودکار شاخه بالادست را برای شاخه پیشفرض تنظیم میکند.
- •
- اگر گزینه پیکربندی push.autoSetupRemote را تنظیم کرده باشید، git push در اولین باری که شاخهای را push میکنید، بالادست را به طور خودکار تنظیم خواهد کرد.
- •
- چکاوت کردن یک شاخه ردیابی ریموت با git checkout <branch> به طور خودکار یک شاخه محلی با آن نام ایجاد کرده و بالادست را به شاخه ریموت تنظیم میکند.
نکته
گاهی از شاخههای بالادست به عنوان "اطلاعات ردیابی" (tracking information) یاد میشود، مانند "set the branch’s tracking information".
شاخههای ردیابی ریموت پیکربندیشده (CONFIGURED REMOTE-TRACKING BRANCHES)
شما اغلب با یک مخزن ریموت یکسان از طریق واکشی منظم و مکرر تعامل دارید. به منظور پیگیری روند پیشرفت چنین مخزن ریموتی، git fetch به شما امکان میدهد متغیرهای پیکربندی remote.<repository>.fetch را تنظیم کنید.
به طور معمول چنین متغیری ممکن است به شکل زیر باشد:
{.RS 4
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
{.RE
این پیکربندی به دو روش استفاده میشود:
- •
- هنگامی که git fetch بدون مشخص کردن شاخهها و/یا تگها برای واکشی در خط فرمان اجرا میشود (مانند git fetch origin یا git fetch)، مقادیر remote.<repository>.fetch به عنوان refspecها استفاده میشوند — آنها مشخص میکنند کدام ارجاعات باید واکشی شوند و کدام ارجاعات محلی باید بهروزرسانی گردند. مثال بالا تمام شاخههای موجود در origin (یعنی هر ارجاعی که با سمت چپ مقدار، یعنی refs/heads/* تطابق دارد) را واکشی کرده و شاخههای ردیابی ریموت مربوطه را در سلسلهمراتب refs/remotes/origin/* بهروزرسانی میکند.
- •
- هنگامی که git fetch با شاخهها و/یا تگهای صریح برای واکشی در خط فرمان اجرا میشود (مانند git fetch origin master)، مقادیر <refspec>s دادهشده در خط فرمان تعیین میکنند چه مواردی باید واکشی شوند (مثلاً master در مثال، که یک خلاصه برای master: است، که به نوبه خود به این معنی است که "شاخه master را واکشی کن اما من صراحتاً نمیگویم کدام شاخه ردیابی ریموت با آن بهروزرسانی شود")، و دستور مثال تنها شاخه master را واکشی خواهد کرد. مقادیر remote.<repository>.fetch تعیین میکنند کدام شاخه ردیابی ریموت (در صورت وجود) بهروزرسانی شود. هنگامی که به این شیوه استفاده شود، مقادیر remote.<repository>.fetch هیچ اثری در تصمیمگیری درباره اینکه چه چیزی واکشی شود ندارند (یعنی زمانی که خط فرمان refspecها را فهرست میکند، این مقادیر به عنوان refspec استفاده نمیشوند)؛ آنها تنها با ایفای نقش یک نگاشت، برای تعیین اینکه ارجاعات واکشیشده در کجا ذخیره شوند استفاده میشوند.
استفاده اخیر از مقادیر remote.<repository>.fetch میتواند با ارائه پارامتر(های) --efmap=<refspec> در خط فرمان لغو و بازنویسی شود.
هرس کردن شاخهها (PRUNING)
گیت دارای یک رفتار پیشفرض برای حفظ دادهها است مگر اینکه صراحتاً دور ریخته شوند؛ این امر به نگهداشتن ارجاعات محلی به شاخههایی در ریموتها که خودشان آن شاخهها را حذف کردهاند نیز تسری مییابد.
در صورت رها شدن و انباشته شدن، این ارجاعات کهنه ممکن است عملکرد را در مخازن بزرگ و پرکار با جابجایی زیاد شاخهها تضعیف کنند، و به عنوان مثال خروجی دستوراتی مانند git branch -a --ontains <commit> را بیجهت طولانی کنند، و همچنین بر هر چیز دیگری که با مجموعه کامل ارجاعات شناختهشده کار میکند تأثیر بگذارند.
این ارجاعات ردیابی ریموت را میتوان به صورت یکباره با یکی از دستورات زیر حذف کرد:
{.RS 4
# در حین واکشی $ git fetch --rune <name> # فقط هرس کن، واکشی انجام نده $ git remote prune <name>{.RE
برای هرس ارجاعات به عنوان بخشی از گردش کار عادی خود بدون نیاز به یادآوری اجرای آن، fetch.prune را به صورت سراسری، یا remote.<name>.prune را برای هر ریموت در پیکربندی تنظیم کنید. نگاه کنید به git-config(1).
اینجا جایی است که موضوع پیچیدهتر و خاصتر میشود. ویژگی هرس در واقع به شاخهها اهمیتی نمیدهد، بلکه ارجاعات محلی --> ریموت را به عنوان تابعی از refspec ریموت هرس میکند (بخشهای <refspec> و «شاخههای ردیابی ریموت پیکربندیشده» در بالا را ببینید).
بنابراین
اگر refspec برای
ریموت شامل
مثلاً refs/tags/*:refs/tags/*
باشد، یا
شما به صورت
دستی
دستوری
مانند git fetch
--rune
<name> "refs/tags/*:refs/tags/*" را
اجرا کنید،
این
شاخههای
ردیابی
ریموت کهنه
نیستند که
حذف
میشوند،
بلکه هر تگ
محلی که در
ریموت وجود
ندارد حذف
خواهد شد.
این ممکن است آن چیزی نباشد که انتظار دارید؛ یعنی میخواهید ریموت <name> را هرس کنید، اما همچنین صراحتاً تگها را از آن واکشی نمایید، بنابراین هنگام واکشی از آن تمام تگهای محلی خود را حذف میکنید، که بیشتر آنها ممکن است در وهله اول از ریموت <name> نیامده باشند.
بنابراین هنگام استفاده از این ویژگی با یک refspec مانند refs/tags/*:refs/tags/*، یا هر refspec دیگری که ممکن است ارجاعات از چندین ریموت را به یک فضای نام محلی یکسان نگاشت کند، بسیار مراقب باشید.
از آنجا که
بهروز نگه
داشتن
شاخهها و
تگها در
ریموت یک
مورد
کاربرد
رایج است،
گزینه --rune-tags
را میتوان
همراه با --rune
برای هرس
تگهای
محلی که در
ریموت وجود
ندارند، و
بهروزرسانی
اجباری
تگهایی که
متفاوت
هستند
ارائه کرد.
هرس تگها
را میتوان
با fetch.pruneTags یا
remote.<name>.pruneTags در
پیکربندی
نیز فعال
کرد. نگاه
کنید به git-config(1).
گزینه --rune-tags
معادل
اعلام refs/tags/*:refs/tags/*
در refspecهای
ریموت است.
این
میتواند
منجر به
برخی
رفتارهای
به ظاهر
عجیب شود:
{.RS 4
# هر دوی این دستورات تگها را واکشی میکنند $ git fetch --0-tags origin 'refs/tags/*:refs/tags/*' $ git fetch --0-tags --rune-tags origin{.RE
دلیل
اینکه
هنگام
ارائه بدون
--rune
یا
نسخههای
پیکربندی
آن خطا
نمیدهد،
انعطافپذیری
نسخههای
پیکربندیشده
و حفظ نگاشت
۱ به ۱ بین
عملکرد
پرچمهای
خط فرمان و
گزینههای
پیکربندی
است.
بسیار
منطقی است
که برای
مثال fetch.pruneTags=true
در ~/.gitconfig
پیکربندی
شود تا هر
زمان که git fetch
--rune
اجرا
میشود
تگها هرس
شوند، بدون
اینکه هر
بار
فراخوانی git
fetch بدون --rune
به یک خطا
تبدیل شود.
هرس کردن
تگها با --rune-tags
هنگام
واکشی یک URL
به جای یک
ریموت
نامگذاریشده
نیز کار
میکند.
تمام موارد
زیر
تگهایی را
که در origin یافت
نمیشوند
هرس
میکنند:
{.RS 4
$ git fetch origin --rune --rune-tags $ git fetch origin --rune 'refs/tags/*:refs/tags/*' $ git fetch <url-of-origin> --rune --rune-tags $ git fetch <url-of-origin> --rune 'refs/tags/*:refs/tags/*'{.RE
خروجی (OUTPUT)
خروجی "git fetch" بستگی به روش انتقال مورد استفاده دارد؛ این بخش خروجی را هنگام واکشی بر روی پروتکل گیت (چه به صورت محلی یا از طریق ssh) و پروتکل هوشمند Smart HTTP شرح میدهد.
وضعیت واکشی در قالب جدول خروجی داده میشود، که در آن هر خط نشاندهنده وضعیت یک ارجاع واحد است. هر خط به این شکل است:
{.RS 4
<flag> <summary> <from> -> <to> [<reason>]{.RE
هنگام
استفاده از
--orcelain،
قالب خروجی
طوری طراحی
شده است که
به راحتی
برای
ماشینها
قابل تجزیه
باشد. در
مقایسه با
قالبهای
خروجی
خوانا برای
انسان، این
قالب به جای
خطای
استاندارد
در خروجی
استاندارد
چاپ میشود.
هر خط به شکل
زیر است:
{.RS 4
<flag> <old-object-id> <new-object-id> <local-reference>{.RE
وضعیت ارجاعات بهروز (up-to-date) تنها در صورتی نشان داده میشود که گزینه -- استفاده شده باشد.
در حالت خروجی فشرده (compact)، که با متغیر پیکربندی fetch.output مشخص میشود، اگر تمام رشته <from> یا <to> در رشته دیگر یافت شود، در رشته دیگر با * جایگزین خواهد شد. به عنوان مثال، master -> origin/master تبدیل میشود به master -> origin/*.
flag
(space)
+
-
t
*
!
=
summary
from
to
reason
مثالها (EXAMPLES)
- •
- بهروزرسانی
شاخههای
ردیابی
ریموت:
{.RS 4
$ git fetch origin
{.REدستور فوق تمام شاخهها را از فضای نام ریموت refs/heads/ کپی کرده و آنها را در فضای نام محلی refs/remotes/origin/ ذخیره میکند، مگر اینکه از گزینه remote.<repository>.fetch برای تعیین یک refspec غیرپیشفرض استفاده شده باشد.
- •
- استفاده
صریح از refspecها:
{.RS 4
$ git fetch origin +seen:seen maint:tmp
{.REاین دستور شاخههای seen و tmp را در مخزن محلی با واکشی از شاخههای (به ترتیب) seen و maint از مخزن ریموت بهروزرسانی (یا در صورت لزوم ایجاد) میکند.
شاخه seen حتی اگر fast-forward نباشد بهروزرسانی خواهد شد، زیرا دارای پیشوند علامت مثبت است؛ شاخه tmp اینگونه نخواهد بود.
- •
- مشاهده
شاخه یک
ریموت،
بدون
پیکربندی
ریموت در
مخزن محلی
شما:
{.RS 4
$ git fetch git://git.kernel.org/pub/scm/git/git.git maint $ git log FETCH_HEAD
{.REدستور اول شاخه maint را از مخزن در git://git.kernel.org/pub/scm/git/git.git واکشی میکند و دستور دوم از FETCH_HEAD برای بررسی شاخه با git-log(1) استفاده میکند. اشیاء واکشیشده در نهایت توسط خانهداری داخلی گیت حذف خواهند شد (نگاه کنید به git-gc(1)).
امنیت (SECURITY)
پروتکلهای fetch و push طوری طراحی نشدهاند که مانع از دزدیدن دادههایی از مخزن دیگر توسط یک طرف شوند که قرار نبوده به اشتراک گذاشته شوند. اگر دادههای خصوصی دارید که باید از یک همتای مخرب محافظت شوند، بهترین گزینه ذخیره آن در یک مخزن دیگر است. این مورد هم برای کلاینتها و هم برای سرورها صدق میکند. به ویژه، فضاهای نام روی یک سرور برای کنترل دسترسی خواندن مؤثر نیستند؛ شما فقط باید دسترسی خواندن به یک فضای نام را به کلاینتهایی اعطا کنید که به آنها برای دسترسی خواندن به کل مخزن اعتماد دارید.
بردارهای حمله شناختهشده به شرح زیر هستند:
- 1.
- قربانی خطوط "have" را ارسال میکند که شناسههای اشیائی را که در اختیار دارد و صراحتاً قصد به اشتراکگذاری آنها را نداشته اما در صورت در اختیار داشتن آنها توسط طرف مقابل میتوانند برای بهینهسازی انتقال استفاده شوند، اعلان میکند. مهاجم یک شناسه شیء X را برای سرقت انتخاب کرده و یک ارجاع به X ارسال میکند، اما نیازی به ارسال محتوای X ندارد زیرا قربانی از قبل آن را دارد. اکنون قربانی باور میکند که مهاجم X را دارد، و بعداً محتوای X را برای مهاجم پس میفرستد. (انجام این حمله برای کلاینت روی سرور سادهترین روش است، با ایجاد یک ارجاع به X در فضای نامی که کلاینت به آن دسترسی دارد و سپس واکشی آن. محتملترین روش برای انجام آن توسط سرور روی کلاینت، "ادغام" X در یک شاخه عمومی و امیدواری به این است که کاربر کارهای بیشتری روی این شاخه انجام داده و بدون توجه به ادغام، آن را به سرور push کند).
- 2.
- همانند شماره ۱، مهاجم یک شناسه شیء X را برای سرقت انتخاب میکند. قربانی شیء Y را که مهاجم از قبل دارد ارسال میکند، و مهاجم به دروغ ادعا میکند که X را دارد و نه Y را، بنابراین قربانی Y را به عنوان یک دلتا نسبت به X ارسال میکند. این دلتا بخشهایی از X را که شبیه به Y هستند برای مهاجم آشکار میسازد.
پیکربندی (CONFIGURATION)
تمام موارد زیر این خط در این بخش به طور گزینشی از مستندات git-config(1) گنجانده شده است. محتوا همان چیزی است که در آنجا یافت میشود:
fetch.recurseSubmodules
fetch.fsckObjects
fetch.fsck.<msg-id>
fetch.fsck.skipList
fetch.unpackLimit
fetch.prune
fetch.pruneTags
fetch.all
fetch.output
fetch.negotiationAlgorithm
همچنین گزینههای --0gotiate-only و --0gotiation-restrict در git-fetch(1) را ببینید.
fetch.showForcedUpdates
fetch.parallel
مقدار 0 پیشفرضی منطقی تعیین خواهد کرد. در صورت عدم تنظیم، پیشفرض آن 1 است.
برای زیرماژولها، این تنظیم میتواند با استفاده از تنظیم پیکربندی submodule.fetchJobs بازنویسی شود.
fetch.writeCommitGraph
fetch.bundleURI
اگر این مقدار را تغییر دهید و مخزن شما دارای مقدار fetch.bundleCreationToken باشد، آنگاه پیش از واکشی از bundle URI جدید، آن مقدار fetch.bundleCreationToken را حذف کنید.
fetch.bundleCreationToken
مقادیر توکن ایجاد توسط ارائهدهندهای که bundle URI خاص را ارائه میدهد انتخاب میشوند. اگر URI را در fetch.bundleURI تغییر دادید، حتماً قبل از واکشی مقدار fetch.bundleCreationToken را حذف کنید.
اشکالات (BUGS)
استفاده از --ecurse-submodules تنها میتواند کامیتهای جدید را در زیرماژولهایی واکشی کند که به صورت محلی مثلاً در $GIT_DIR/modules/ حضور دارند. اگر بالادست یک زیرماژول جدید اضافه کند، آن زیرماژول تا زمانی که کلون نشود (مثلاً توسط git submodule update) قابل واکشی نیست. انتظار میرود این مشکل در نسخههای آینده گیت برطرف شود.
همچنین ببینید (SEE ALSO)
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |