GIT-UPDATE-INDEX(1) Git Manual GIT-UPDATE-INDEX(1)

git-update-index - ثبت محتویات فایل‌های درخت کاری در ایندکس

git update-index
             [--add] [--remove | --force-remove] [--replace]
             [--refresh] [-q] [--unmerged] [--ignore-missing]
             [(--cacheinfo <mode>,<object>,<file>)...]
             [--chmod=(+|-)x]
             [--[no-]assume-unchanged]
             [--[no-]skip-worktree]
             [--[no-]ignore-skip-worktree-entries]
             [--[no-]fsmonitor-valid]
             [--ignore-submodules]
             [--[no-]split-index]
             [--[no-|test-|force-]untracked-cache]
             [--[no-]fsmonitor]
             [--really-refresh] [--unresolve] [--again | -g]
             [--info-only] [--index-info]
             [-z] [--stdin] [--index-version <n>]
             [--show-index-version]
             [--verbose]
             [--] [<file>...]

ایندکس را ویرایش می‌کند. هر فایل مشخص‌شده درون ایندکس به‌روزرسانی شده و هر وضعیت unmerged (ادغام‌نشده) یا needs updating (نیازمند به‌روزرسانی) پاک می‌شود.

همچنین برای روشی کاربرپسندتر جهت انجام برخی از رایج‌ترین عملیات‌ها روی ایندکس، git-add(1) را ببینید.

نحوه مدیریت فایل‌های مشخص‌شده توسط git update-index را می‌توان با استفاده از گزینه‌های مختلف تغییر داد:

--add

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

--remove

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

--refresh

ایندکس فعلی را بررسی کرده و با بررسی اطلاعات stat() می‌سنجد که آیا ادغام یا به‌روزرسانی لازم است یا خیر.

-q

حالت بی‌صدا (Quiet). اگر --refresh متوجه شود که ایندکس به به‌روزرسانی نیاز دارد، رفتار پیش‌فرض اعلام خطا و خروج است. این گزینه باعث می‌شود git update-index در هر صورت ادامه دهد.

--ignore-submodules

برای به‌روزرسانی زیرماژول‌ها تلاش نمی‌کند. این گزینه تنها زمانی در نظر گرفته می‌شود که قبل از --refresh داده شود.

--unmerged

اگر --refresh تغییرات ادغام‌نشده‌ای در ایندکس پیدا کند، رفتار پیش‌فرض اعلام خطا و خروج است. این گزینه باعث می‌شود git update-index در هر صورت ادامه دهد.

--ignore-missing

فایل‌های مفقودشده را در حین اجرای --refresh نادیده می‌گیرد.

--cacheinfo <mode>,<object>,<path>, --cacheinfo <mode> <object> <path>

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

--index-info

اطلاعات ایندکس را از ورودی استاندارد (stdin) می‌خواند.

--chmod=(+|-)x

مجوزهای اجرای (execute) فایل‌های به‌روزرسانی‌شده را تنظیم می‌کند.

--assume-unchanged, --no-assume-unchanged

هنگامی که این فلگ مشخص شود، نام‌های شیء ثبت‌شده برای مسیرها به‌روزرسانی نمی‌شوند. در عوض، این گزینه بیت «assume unchanged» (فرضِ بدون تغییر) را برای مسیرها تنظیم یا لغو می‌کند. وقتی بیت «assume unchanged» روشن باشد، کاربر تعهد می‌دهد که فایل را تغییر ندهد و به گیت اجازه می‌دهد فرض کند فایل درخت کاری با آنچه در ایندکس ثبت شده مطابقت دارد. اگر بخواهید فایل درخت کاری را تغییر دهید، باید این بیت را لغو کنید تا به گیت اطلاع داده شود. این کار گاهی اوقات هنگام کار روی یک پروژه بزرگ در سیستم فایلی که فراخوان سیستمی lstat(2) بسیار کندی دارد (مانند cifs) مفید است.

در صورتی که گیت نیاز به تغییر این فایل در ایندکس داشته باشد (مثلاً هنگام ادغام یک کامیت)، با خطا (به‌صورت کنترل‌شده) مواجه می‌شود؛ بنابراین در صورتی که فایلِ فرض‌شده در بالادست تغییر کند، باید وضعیت را به صورت دستی مدیریت کنید.

--really-refresh

مانند --refresh است، اما اطلاعات stat را بدون قید و شرط و بدون توجه به تنظیم «assume unchanged» بررسی می‌کند.

--skip-worktree, --no-skip-worktree

هنگامی که یکی از این فلگ‌ها مشخص شود، نام‌های شیء ثبت‌شده برای مسیرها به‌روزرسانی نمی‌شوند. در عوض، این گزینه‌ها بیت «skip-worktree» (صرف‌نظر از درخت کاری) را برای مسیرها تنظیم یا لغو می‌کنند. برای اطلاعات بیشتر بخش «بیت SKIP-WORKTREE» در ادامه را ببینید.

--ignore-skip-worktree-entries, --no-ignore-skip-worktree-entries

ورودی‌های skip-worktree (معروف به «تنها در ایندکس» یا index-only) را حتی زمانی که گزینه --remove مشخص شده باشد، حذف نمی‌کند.

--fsmonitor-valid, --no-fsmonitor-valid

هنگامی که یکی از این فلگ‌ها مشخص شود، نام‌های شیء ثبت‌شده برای مسیرها به‌روزرسانی نمی‌شوند. در عوض، این گزینه‌ها بیت «fsmonitor valid» (معتبر بودن پایشگر سیستم فایل) را برای مسیرها تنظیم یا لغو می‌کنند. برای اطلاعات بیشتر بخش «پایشگر سیستم فایل» در ادامه را ببینید.

-g, --again

دستور git update-index را روی مسیرهایی اجرا می‌کند که ورودی‌های ایندکس آن‌ها با ورودی‌های کامیت HEAD متفاوت است.

--unresolve

وضعیت unmerged (ادغام‌نشده) یا needs updating (نیازمند به‌روزرسانی) یک فایل را در حین ادغام در صورتی که به اشتباه پاک شده باشد، بازمی‌گرداند.

--info-only

برای تمام آرگومان‌های <file> که بعد از این فلگ می‌آیند، در پایگاه داده اشیاء شیء جدید ایجاد نمی‌کند؛ تنها شناسه اشیاء آن‌ها را درون ایندکس درج می‌کند.

--force-remove

فایل را از ایندکس حذف می‌کند حتی اگر چنین فایلی همچنان در دایرکتوری کاری وجود داشته باشد. (شامل --remove نیز می‌شود.)

--replace

به‌طور پیش‌فرض، هنگامی که یک فایل path در ایندکس وجود دارد، git update-index تلاش برای افزودن path/file را رد می‌کند. به طور مشابه اگر فایل path/file وجود داشته باشد، فایل path را نمی‌توان اضافه کرد. با فلگ --replace، ورودی‌های موجود که با ورودی در حال افزودن تداخل دارند، به طور خودکار همراه با پیام‌های هشدار حذف می‌شوند.

--stdin

به‌جای دریافت فهرستی از مسیرها از خط فرمان، فهرست مسیرها را از ورودی استاندارد می‌خواند. مسیرها به‌طور پیش‌فرض با نویسه LF (یعنی یک مسیر در هر خط) از هم جدا می‌شوند.

--verbose

آنچه را که به ایندکس اضافه یا از آن حذف می‌شود گزارش می‌دهد.

--index-version <n>

ایندکس حاصل را با نسخه قالب روی دیسک مشخص‌شده می‌نویسد. نسخه‌های پشتیبانی‌شده 2، 3 و 4 هستند. نسخه پیش‌فرض فعلی 2 یا 3 است، بسته به اینکه آیا ویژگی‌های اضافی استفاده شده باشند یا خیر، مانند git add -N. همراه با --verbose، نسخه‌ای که فایل ایندکس قبل و بعد از این دستور استفاده می‌کند نیز گزارش می‌شود.

نسخه 4 یک فشرده‌سازی ساده نام مسیر انجام می‌دهد که اندازه ایندکس را در مخازن بزرگ 30% تا 50% کاهش می‌دهد، که منجر به زمان بارگذاری سریع‌تر می‌شود. گیت از نسخه 1.8.0 که در اکتبر 2012 منتشر شد از آن پشتیبانی می‌کند، و پشتیبانی از آن در سال 2016 به libgit2 و در سال 2020 به JGit اضافه شد. نسخه‌های قدیمی‌تر این صفحه راهنما آن را «نسبتاً جدید» می‌نامیدند، اما امروزه باید به عنوان یک فناوری بالغ در نظر گرفته شود.

--show-index-version

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

-z

تنها همراه با --stdin یا --index-info معنی دارد؛ مسیرها به جای LF با نویسه NUL از یکدیگر جدا می‌شوند.

--split-index, --no-split-index

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

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

--untracked-cache, --no-untracked-cache

ویژگی حافظه پنهان ردیابی‌نشده (untracked cache) را فعال یا غیرفعال می‌کند. لطفاً قبل از فعال کردن آن از --test-untracked-cache استفاده کنید.

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

--test-untracked-cache

تنها آزمایش‌هایی را روی دایرکتوری کاری انجام می‌دهد تا اطمینان حاصل شود که حافظه پنهان ردیابی‌نشده قابل استفاده است. اگر واقعاً می‌خواهید از آن استفاده کنید، باید پس از آن حافظه پنهان ردیابی‌نشده را به صورت دستی با استفاده از --untracked-cache یا --force-untracked-cache یا متغیر پیکربندی core.untrackedCache فعال کنید. اگر آزمایشی با شکست مواجه شود، کد خروج 1 خواهد بود و پیامی توضیح می‌دهد که چه چیزی طبق انتظار کار نمی‌کند؛ در غیر این صورت کد خروج 0 بوده و عبارت OK چاپ می‌شود.

--force-untracked-cache

مشابه --untracked-cache است. برای سازگاری با نسخه‌های قدیمی‌تر گیت ارائه شده است که در آن‌ها --untracked-cache پیش‌تر به معنای --test-untracked-cache نیز بود، در حالی که این گزینه افزونه را بدون قید و شرط فعال می‌کرد.

--fsmonitor, --no-fsmonitor

ویژگی پایشگر سیستم فایل (file system monitor) را فعال یا غیرفعال می‌کند. این گزینه‌ها بدون توجه به مقدار متغیر پیکربندی core.fsmonitor اعمال می‌شوند (نگاه کنید به git-config(1)). اما زمانی که تغییر بر خلاف مقدار پیکربندی‌شده باشد، هشداری صادر می‌شود؛ چرا که مقدار پیکربندی‌شده در دفعه بعدی خواندن ایندکس اعمال خواهد شد و این کار اثر مورد نظر گزینه را از بین می‌برد.

--

دیگر هیچ آرگومانی را به عنوان گزینه تفسیر نمی‌کند.

<file>

فایل‌هایی که باید روی آن‌ها عمل شود. توجه داشته باشید فایل‌هایی که با . شروع می‌شوند نادیده گرفته می‌شوند. این شامل ./file و dir/./file است. اگر این رفتار را نمی‌خواهید، از نام‌های تمیزتر استفاده کنید. همین موضوع در مورد دایرکتوری‌هایی که با / ختم می‌شوند و مسیرهایی که شامل // هستند نیز صدق می‌کند.

گزینه --refresh فایل sha1 جدیدی محاسبه نمی‌کند و ایندکس را برای تغییرات حالت یا محتوا به‌روز نمی‌کند. اما کاری که انجام می‌دهد این است که اطلاعات stat یک فایل را با ایندکس «تطبیق مجدد» می‌دهد، به طوری که می‌توانید ایندکس را برای فایلی که تغییر نکرده اما ورودی stat آن قدیمی شده است، تازه‌سازی کنید.

برای مثال، ممکن است پس از اجرای git read-tree بخواهید این کار را انجام دهید تا جزئیات stat ایندکس را با فایل‌های مناسب پیوند دهید.

گزینه --cacheinfo برای ثبت فایلی استفاده می‌شود که در دایرکتوری کاری فعلی وجود ندارد. این قابلیت برای ادغام با حداقل دریافت (minimum-checkout merging) مفید است.

برای اینکه وانمود کنید فایلی در یک مسیر مشخص با حالت (mode) و sha1 مشخص دارید، اجرا کنید:

$ git update-index --add --cacheinfo <mode>,<sha1>,<path>

گزینه --info-only برای ثبت فایل‌ها بدون قرار دادن آن‌ها در پایگاه داده اشیاء استفاده می‌شود. این قابلیت برای مخازن صرفاً وضعیتی (status-only) مفید است.

هر دو گزینه --cacheinfo و --info-only عملکرد مشابهی دارند: ایندکس به‌روزرسانی می‌شود اما پایگاه داده اشیاء به‌روزرسانی نمی‌شود. گزینه --cacheinfo زمانی مفید است که شیء در پایگاه داده موجود باشد اما فایل به صورت محلی در دسترس نباشد. گزینه --info-only زمانی مفید است که فایل در دسترس باشد، اما نمی‌خواهید پایگاه داده اشیاء را به‌روز کنید.

گزینه --index-info سازوکار قدرتمندتری است که به شما امکان می‌دهد تعاریف چندگانه ورودی را از طریق ورودی استاندارد تغذیه کنید، و به طور خاص برای اسکریپت‌ها طراحی شده است. این گزینه می‌تواند ورودی‌هایی در سه قالب دریافت کند:

1.mode SP type SP sha1 TAB path

این قالب برای درج خروجی git ls-tree درون ایندکس است.

2.mode SP sha1 SP stage TAB path

این قالب برای قرار دادن مرحله‌های مرتبه بالاتر (higher order stages) در فایل ایندکس است و با خروجی git ls-files --stage مطابقت دارد.

3.mode SP sha1 TAB path

این قالب دیگر توسط هیچ دستور گیت تولید نمی‌شود، اما توسط update-index --index-info پشتیبانی شده و همچنان پشتیبانی خواهد شد.

برای قرار دادن یک ورودی مرحله بالاتر در ایندکس، مسیر ابتدا باید با تغذیه یک ورودی mode=0 برای آن مسیر حذف شود، و سپس خطوط ورودی لازم در قالب سوم تغذیه شوند.

به عنوان مثال، با شروع از این ایندکس:

$ git ls-files -s
100644 8a1218a1024a212bb3db30becd860315f9f3ac52 0       frotz

می‌توانید ورودی زیر را به --index-info بدهید:

$ git update-index --index-info
0 0000000000000000000000000000000000000000      frotz
100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1       frotz
100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2       frotz

خط اول ورودی مقدار 0 را به عنوان mode برای حذف مسیر تغذیه می‌کند؛ تا زمانی که SHA-1 دارای قالب‌بندی صحیحی باشد، مقدار آن اهمیتی ندارد. سپس خط دوم و سوم ورودی‌های مرحله 1 و مرحله 2 را برای آن مسیر تغذیه می‌کنند. پس از موارد فوق، با این نتیجه مواجه خواهیم شد:

$ git ls-files -s
100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1       frotz
100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2       frotz

بسیاری از عملیات‌ها در گیت وابسته به این هستند که سیستم فایل شما پیاده‌سازی کارآمدی از lstat(2) داشته باشد، تا اطلاعات st_mtime فایل‌های درخت کاری بتواند با کمترین هزینه بررسی شود و مشخص گردد آیا محتویات فایل نسبت به نسخه ثبت‌شده در فایل ایندکس تغییر کرده است یا خیر. متأسفانه برخی سیستم‌های فایل دارای lstat(2) ناکارآمد هستند. اگر سیستم فایل شما یکی از آن‌هاست، می‌توانید بیت «assume unchanged» را روی مسیرهایی که تغییر نداده‌اید تنظیم کنید تا گیت این بررسی را انجام ندهد. توجه داشته باشید که تنظیم این بیت روی یک مسیر به این معنا نیست که گیت محتویات فایل را برای بررسی تغییرات چک می‌کند — بلکه باعث می‌شود گیت از هرگونه بررسی صرف‌نظر کرده و فرض کند فایل تغییر نکرده است. هنگامی که تغییراتی در فایل‌های درخت کاری ایجاد می‌کنید، باید با حذف بیت «assume unchanged»، چه قبل و چه بعد از ویرایش آن‌ها، این موضوع را صراحتاً به گیت اطلاع دهید.

به منظور تنظیم بیت «assume unchanged»، از گزینه --assume-unchanged استفاده کنید. برای لغو آن، از --no-assume-unchanged استفاده نمایید. برای مشاهده فایل‌هایی که بیت «assume unchanged» روی آن‌ها تنظیم شده است، از git ls-files -v استفاده کنید (نگاه کنید به git-ls-files(1)).

این دستور متغیر پیکربندی core.ignorestat را بررسی می‌کند. وقتی مقدار آن true باشد، مسیرهای به‌روزرسانی‌شده با git update-index paths... و مسیرهای به‌روزرسانی‌شده با سایر دستورات گیت که هم ایندکس و هم درخت کاری را به‌روزرسانی می‌کنند (مانند git apply --index، git checkout-index -u و git read-tree -u) به طور خودکار به عنوان «assume unchanged» علامت‌گذاری می‌شوند. توجه داشته باشید که اگر git update-index --refresh متوجه شود که فایل درخت کاری با ایندکس مطابقت دارد، بیت «assume unchanged» تنظیم نمی‌شود (اگر می‌خواهید آن‌ها را به عنوان «assume unchanged» علامت‌گذاری کنید، از git update-index --really-refresh استفاده کنید).

گاهی کاربران بیت assume-unchanged را با بیت skip-worktree اشتباه می‌گیرند. برای توضیح تفاوت‌ها به بند پایانی در بخش «بیت SKIP-WORKTREE» در ادامه مراجعه کنید.

برای به‌روزرسانی و تازه‌سازی تنها فایل‌هایی که از قبل دریافت (checkout) شده‌اند:

$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh

روی یک سیستم فایل ناکارآمد با تنظیم core.ignorestat:

$ git update-index --really-refresh              (1)
$ git update-index --no-assume-unchanged foo.c   (2)
$ git diff --name-only                           (3)
$ edit foo.c
$ git diff --name-only                           (4)
M foo.c
$ git update-index foo.c                         (5)
$ git diff --name-only                           (6)
$ edit foo.c
$ git diff --name-only                           (7)
$ git update-index --no-assume-unchanged foo.c   (8)
$ git diff --name-only                           (9)
M foo.c
1. فراخوان lstat(2) را وادار می‌کند تا برای مسیرهایی که با ایندکس مطابقت دارند، بیت «assume unchanged» را تنظیم کند.
2. مسیر مورد نظر برای ویرایش را علامت‌گذاری می‌کند.
3. این دستور lstat(2) را اجرا کرده و می‌بیند که ایندکس با مسیر مطابقت دارد.
4. این دستور lstat(2) را اجرا کرده و متوجه می‌شود که ایندکس با مسیر مطابقت ندارد.
5. ثبت نسخه جدید در ایندکس، بیت «assume unchanged» را تنظیم می‌کند.
6. و بدون تغییر فرض می‌شود.
7. حتی پس از اینکه آن را ویرایش کنید.
8. می‌توانید پس از انجام تغییر، گیت را از آن مطلع کنید.
9. اکنون با lstat(2) بررسی می‌کند و درمی‌یابد که تغییر یافته است.

بیت skip-worktree را می‌توان در یک جمله (طولانی) تعریف کرد: به گیت بگو تا حد امکان از نوشتن فایل در دایرکتوری کاری خودداری کند، و در صورتی که فایل در دایرکتوری کاری وجود نداشت، با آن طوری رفتار کند که گویی تغییر نکرده است.

توجه داشته باشید که همه دستورات گیت به این بیت توجه نمی‌کنند، و برخی تنها تا حدی از آن پشتیبانی می‌کنند.

فلگ‌های update-index و قابلیت‌های read-tree مربوط به بیت skip-worktree، قبل از معرفی دستور git-sparse-checkout(1) وجود داشتند که روشی بسیار آسان‌تر برای پیکربندی و مدیریت بیت‌های skip-worktree ارائه می‌دهد. اگر می‌خواهید درخت کاری خود را کاهش دهید تا تنها با زیرمجموعه‌ای از فایل‌های مخزن سر و کار داشته باشید، اکیداً توصیه می‌کنیم از git-sparse-checkout(1) به جای دستورات سطح پایین update-index و read-tree استفاده کنید.

هدف اصلی بیت skip-worktree فعال‌سازی دریافت‌های کم‌پشت (sparse checkouts) است، یعنی داشتن دایرکتوری‌های کاری که تنها زیرمجموعه‌ای از مسیرها در آن‌ها وجود دارد. هنگامی که بیت skip-worktree تنظیم شود، دستورات گیت (مانند switch، pull و merge) از نوشتن این فایل‌ها خودداری خواهند کرد. با این حال، این دستورات گاهی اوقات در موارد مهم مانند تداخل در حین ادغام یا بازنشانی (rebase) این فایل‌ها را در هر صورت می‌نویسند. همچنین دستورات گیت از تلقی عدم وجود این فایل‌ها به عنوان یک حذف عمدی خودداری می‌کنند؛ برای مثال git add -u حذفی را برای این فایل‌ها مرحله‌بندی نمی‌کند و git commit -a نیز کامیتی برای حذف آن‌ها ایجاد نخواهد کرد.

اگرچه این بیت شبیه به بیت assume-unchanged به نظر می‌رسد، اما هدف آن متفاوت است. بیت assume-unchanged برای باقی گذاشتن فایل در درخت کاری است به طوری که گیت بررسی تغییرات آن را نادیده گرفته و فرض کند فایل تغییر نکرده است (هرچند اگر بتواند بدون stat گرفتن از فایل متوجه تغییر آن شود، مجاز به ثبت تغییرات است). در حالی که skip-worktree به گیت می‌گوید عدم حضور فایل را نادیده بگیرد، تا حد امکان از به‌روزرسانی آن با دستوراتی که بخش عمده دایرکتوری کاری را به‌روز می‌کنند (مانند checkout، switch، pull و غیره) خودداری کند، و نبودِ آن در کامیت‌ها ثبت نشود. توجه داشته باشید که در sparse checkoutها (راه‌اندازی‌شده توسط git sparse-checkout یا با تنظیم core.sparseCheckout روی true)، اگر فایلی در ایندکس با skip-worktree علامت‌گذاری شده باشد اما در درخت کاری یافت شود، گیت بیت skip-worktree را برای آن فایل پاک خواهد کرد.

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

در این حالت، ایندکس به دو فایل تقسیم می‌شود: $GIT_DIR/index و $GIT_DIR/sharedindex.<SHA-1>. تغییرات در $GIT_DIR/index (ایندکس تفکیک‌شده) انباشته می‌شوند، در حالی که فایل ایندکس مشترک شامل تمام ورودی‌های ایندکس بوده و بدون تغییر باقی می‌ماند.

هنگامی که تعداد ورودی‌ها در ایندکس تفکیک‌شده به مقداری برسد که توسط متغیر پیکربندی splitIndex.maxPercentChange مشخص شده است، تمام تغییرات در ایندکس تفکیک‌شده به فایل ایندکس مشترک بازگردانده می‌شوند (نگاه کنید به git-config(1)).

هر بار که یک فایل ایندکس مشترک جدید ایجاد می‌شود، فایل‌های ایندکس مشترک قدیمی در صورتی که زمان ویرایش آن‌ها قدیمی‌تر از مقدار مشخص‌شده توسط متغیر پیکربندی splitIndex.sharedIndexExpire باشد، حذف می‌شوند (نگاه کنید به git-config(1)).

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

این حافظه پنهان (cache) با هدف افزایش سرعت دستوراتی در نظر گرفته شده است که به شناسایی فایل‌های ردیابی‌نشده می‌پردازند، مانند git status.

این قابلیت با ثبت mtime دایرکتوری‌های درخت کاری و سپس صرف‌نظر کردن از خواندن دایرکتوری‌ها و فراخوان‌های stat برای فایل‌های درون آن دایرکتوری‌هایی که mtime آن‌ها تغییر نکرده است، کار می‌کند. برای کارکرد صحیح این قابلیت، سیستم‌عامل و سیستم فایل زیربنایی باید در صورت افزودن، ویرایش یا حذف فایل‌ها در دایرکتوری، فیلد st_mtime دایرکتوری‌ها را تغییر دهند.

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

اگر می‌خواهید این ویژگی را فعال (یا غیرفعال) کنید، استفاده از متغیر پیکربندی core.untrackedCache (نگاه کنید به git-config(1)) آسان‌تر از استفاده از گزینه --untracked-cache در دستور git update-index در تک‌تک مخازن است، به ویژه اگر بخواهید این کار را در تمام مخازنی که استفاده می‌کنید انجام دهید؛ چرا که می‌توانید متغیر پیکربندی را تنها یک بار در $HOME/.gitconfig خود روی true (یا false) تنظیم کنید و تمام مخازن شما را تحت تأثیر قرار دهد.

هنگامی که متغیر پیکربندی core.untrackedCache تغییر می‌کند، دفعه بعد که دستوری ایندکس را می‌خواند، حافظه پنهان ردیابی‌نشده به ایندکس اضافه یا از آن حذف می‌شود؛ در حالی که هنگام استفاده از --[no-|force-]untracked-cache، حافظه پنهان ردیابی‌نشده بلافاصله به ایندکس افزوده یا از آن حذف می‌گردد.

قبل از نسخه 2.17، حافظه پنهان ردیابی‌نشده دارای باگی بود که در آن جایگزینی یک دایرکتوری با یک پیوند نمادین (symlink) به دایرکتوری دیگر می‌توانست باعث شود فایل‌های ردیابی‌شده توسط گیت به اشتباه به عنوان ردیابی‌نشده نشان داده شوند. کامیت «status: add a failing test showing a core.untrackedCache bug» در مخزن git.git را ببینید. یک راهکار موقت برای آن این است (و این ممکن است برای سایر باگ‌های کشف‌نشده در آینده نیز کار کند):

$ git -c core.untrackedCache=false status

همچنین نشان داده شده است که این باگ در ساختارهای داخلی حافظه پنهان ردیابی‌نشده، موارد غیرپیوند نمادین جایگزینی یک دایرکتوری با یک فایل را نیز تحت تأثیر قرار می‌دهد، اما هیچ موردی گزارش نشده که منجر به خروجی نادرست «git status» شده باشد.

همچنین مواردی وجود دارد که در آن‌ها ایندکس‌های موجود که توسط نسخه‌های گیت قبل از 2.17 نوشته شده‌اند، به دایرکتوری‌هایی ارجاع می‌دهند که دیگر وجود ندارند، و این ممکن است باعث چاپ هشدارهای متعدد «could not open directory» در «git status» شود. این‌ها هشدارهای جدیدی برای مشکلات موجود قبلی هستند که پیش از این بی‌صدا نادیده گرفته می‌شدند.

همانند باگ توضیح‌داده‌شده در بالا، راهکار این است که یک بار دستور «git status» را با core.untrackedCache=false اجرا کنید تا داده‌های معیوب باقی‌مانده پاک‌سازی شوند.

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

این ویژگی به گیت امکان می‌دهد با یک پایشگر سیستم فایل (نگاه کنید به git-fsmonitor--daemon(1) و بخش «fsmonitor-watchman» در githooks(5)) که می‌تواند تغییر فایل‌ها را اطلاع دهد، همکاری کند. این کار به گیت امکان می‌دهد از اجرای lstat() روی تک‌تک فایل‌ها برای یافتن فایل‌های تغییریافته بی‌نیاز شود.

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

اگر می‌خواهید این ویژگی را فعال (یا غیرفعال) کنید، استفاده از متغیر پیکربندی core.fsmonitor (نگاه کنید به git-config(1)) آسان‌تر از استفاده از گزینه --fsmonitor در دستور git update-index در تک‌تک مخازن است، به ویژه اگر بخواهید این کار را در تمام مخازنی که استفاده می‌کنید انجام دهید؛ زیرا می‌توانید متغیر پیکربندی را تنها یک بار در $HOME/.gitconfig خود تنظیم کنید تا همه مخازن مورد استفاده شما را تحت تأثیر قرار دهد.

هنگامی که متغیر پیکربندی core.fsmonitor تغییر می‌کند، دفعه بعدی که دستوری ایندکس را می‌خواند، پایشگر سیستم فایل به ایندکس اضافه یا از آن حذف می‌شود. هنگام استفاده از --[no-]fsmonitor، پایشگر سیستم فایل بلافاصله به ایندکس افزوده یا از آن حذف می‌گردد.

این دستور از متغیر پیکربندی core.filemode پیروی می‌کند. اگر مخزن شما روی سیستم فایلی قرار دارد که بیت‌های اجرایی آن غیرقابل اعتماد هستند، این متغیر باید روی false تنظیم شود (نگاه کنید به git-config(1)). این کار باعث می‌شود در صورتی که تفاوت فقط در بیت اجرایی باشد، دستور تفاوت بین حالت‌های فایل ثبت‌شده در ایندکس و حالت فایل روی سیستم فایل را نادیده بگیرد. در چنین سیستم فایل نامساعدی، ممکن است لازم باشد از git update-index --chmod= استفاده کنید.

به طور مشابه، اگر متغیر پیکربندی core.symlinks روی false تنظیم شده باشد (نگاه کنید به git-config(1))، پیوندهای نمادین به صورت فایل‌های معمولی دریافت (checkout) می‌شوند و این دستور حالت ثبت‌شده فایل را از پیوند نمادین به فایل معمولی تغییر نمی‌دهد.

این دستور متغیر پیکربندی core.ignorestat را بررسی می‌کند. بخش استفاده از بیت "assume unchanged" در بالا را ببینید.

این دستور همچنین متغیر پیکربندی core.trustctime را بررسی می‌کند. این متغیر زمانی می‌تواند مفید باشد که زمان تغییر inode مرتباً توسط چیزی خارج از گیت ویرایش می‌شود (خزنده‌های سیستم فایل و سیستم‌های پشتیبان‌گیری از ctime برای علامت‌گذاری فایل‌های پردازش‌شده استفاده می‌کنند) (نگاه کنید به git-config(1)).

افزونه حافظه پنهان ردیابی‌نشده را می‌توان توسط متغیر پیکربندی core.untrackedCache فعال کرد (نگاه کنید به git-config(1)).

کاربران اغلب تلاش می‌کنند از بیت‌های assume-unchanged و skip-worktree استفاده کنند تا به گیت بگویند تغییرات فایل‌های ردیابی‌شده را نادیده بگیرد. این کار طبق انتظار عمل نمی‌کند، چرا که گیت ممکن است هنگام انجام برخی عملیات‌ها همچنان فایل‌های درخت کاری را با ایندکس مقایسه کند. به طور کلی، گیت روشی برای نادیده گرفتن تغییرات فایل‌های ردیابی‌شده ارائه نمی‌دهد، بنابراین راهکارهای جایگزین توصیه می‌شوند.

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

git-config(1), git-add(1), git-ls-files(1)

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

2026-06-29 Git 2.55.0