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

git-checkout-index - کپی فایل‌ها از ایندکس به درخت کاری

git checkout-index [-u] [-q] [-a] [-f] [-n] [--prefix=<string>]
                   [--stage=<number>|all]
                   [--temp]
                   [--ignore-skip-worktree-bits]
                   [-z] [--stdin]
                   [--] [<file>...]

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

-u, --index

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

-q, --quiet

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

-f, --force

بازنویسی فایل‌های موجود را اجبار می‌کند.

-a, --all

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

-n, --no-create

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

--prefix=<string>

هنگام ایجاد فایل‌ها، <string> را به ابتدای نام آن‌ها اضافه می‌کند (معمولاً یک دایرکتوری شامل یک / در انتها).

--stage=<number>|all

به جای استخراج مدخل‌های ادغام‌نشده، فایل‌ها را از مرحله (stage) مشخص‌شده کپی می‌کند. مقدار <number> باید بین ۱ تا ۳ باشد. نکته: گزینه --stage=all به طور خودکار شامل --temp نیز می‌شود.

--temp

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

--ignore-skip-worktree-bits

تمام فایل‌ها را استخراج می‌کند، از جمله فایل‌هایی که بیت skip-worktree برای آن‌ها فعال است.

--stdin

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

-z

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

--

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

ترتیب فلگ‌ها در گذشته اهمیت داشت، اما اکنون دیگر تفاوتی ندارد.

اجرای خالی git checkout-index هیچ کاری انجام نمی‌دهد. احتمالاً منظور شما git checkout-index -a بوده است. و اگر می‌خواهید بازنویسی را اجبار کنید، باید از git checkout-index -f -a استفاده کنید.

شهودی بودن هدف این دستور نیست؛ تکرارپذیری هدف آن است. دلیل رفتار «نبود آرگومان یعنی هیچ کاری انجام نشود» این است که در اسکریپت‌ها بتوانید چنین کارهایی انجام دهید:

$ find . -name '*.h' -print0 | xargs -0 git checkout-index -f --

این دستور تمام فایل‌های موجود *.h را با نسخه‌های کش‌شده آن‌ها جایگزین می‌کند. اگر یک خط فرمان خالی به معنی «همه» می‌بود، در این صورت همه‌چیز در ایندکس به اجبار تازه‌سازی می‌شد که هدف این نبود. اما از آنجا که git checkout-index گزینه --stdin را می‌پذیرد، استفاده از روش زیر سریع‌تر خواهد بود:

$ find . -name '*.h' -print0 | git checkout-index -f -z --stdin

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

هنگامی که --temp استفاده شود (یا با --stage=all به‌طور ضمنی اعمال گردد)، دستور git checkout-index برای هر مدخل ایندکس که استخراج می‌شود یک فایل موقت ایجاد می‌کند. ایندکس با اطلاعات stat به‌روزرسانی نخواهد شد. این گزینه‌ها زمانی کاربرد دارند که فراخواننده به تمام مراحل (stages) همه مدخل‌های ادغام‌نشده نیاز داشته باشد تا فایل‌های ادغام‌نشده توسط یک ابزار ادغام خارجی پردازش شوند.

فهرستی در stdout نوشته خواهد شد که ارتباط میان نام فایل‌های موقت و مسیرهای ردگیری‌شده را ارائه می‌دهد. قالب این فهرست دارای دو حالت است:

1.tempname TAB path RS

قالب نخست زمانی استفاده می‌شود که --stage مشخص نشده باشد یا برابر با --stage=all نباشد. فیلد tempname نام فایل موقتی است که محتوای فایل را در بر دارد و path مسیر ردگیری‌شده در ایندکس است. تنها مدخل‌های درخواست‌شده در خروجی درج می‌شوند.

2.stage1temp SP stage2temp SP stage3tmp TAB path RS

قالب دوم زمانی استفاده می‌شود که --stage=all باشد. سه فیلد موقت مراحل (stage1temp, stage2temp, stage3temp) نام فایل موقت را در صورت وجود مدخل مرحله در ایندکس یا علامت . را در صورت عدم وجود مدخل مرحله درج می‌کنند. مسیرهایی که تنها مدخل مرحله 0 دارند همیشه از خروجی حذف می‌شوند.

در هر دو قالب، RS (جداکننده رکورد) به‌طور پیش‌فرض خط جدید (newline) است اما اگر -z در خط فرمان داده شده باشد، بایت null خواهد بود. نام فایل‌های موقت همیشه رشته‌های امن هستند؛ هرگز شامل جداکننده‌های دایرکتوری یا کاراکترهای فاصله نخواهند بود. فیلد path همیشه نسبت به دایرکتوری جاری و نام فایل‌های موقت همیشه نسبت به دایرکتوری ریشه سطح بالا (top level) است.

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

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

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

استفاده از git checkout-index برای «برون‌بری یک درخت کامل»

قابلیت پیشوند (prefix) استفاده از git checkout-index را به عنوان یک تابع «برون‌بری به صورت درخت» بسیار ساده می‌کند. کافی است درخت مورد نظر را در ایندکس بخوانید و دستور زیر را اجرا کنید:
$ git checkout-index --prefix=git-export-dir/ -a

دستور git checkout-index ایندکس را در دایرکتوری مشخص‌شده «برون‌بری» می‌کند.

علامت "/" پایانی اهمیت دارد. نام فایل‌های برون‌بری‌شده دقیقاً با رشته تعیین‌شده پیشوندگذاری می‌شوند. این مورد را با مثال بعدی مقایسه کنید.

برون‌بری فایل‌ها با یک پیشوند

$ git checkout-index --prefix=.merged- Makefile

این دستور نسخه ذخیره‌شده جاری از Makefile را در فایل .merged-Makefile استخراج می‌کند.

git-update-index(1), git-read-tree(1), git(1)

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

2026-06-29 Git 2.55.0