| GIT-RM(1) | راهنمای Git | GIT-RM(1) |
نام (NAME)
git-rm - حذف فایلها از درخت کاری و ایندکس
خلاصه دستور (SYNOPSIS)
git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]
[--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]
[--] [<pathspec>...]
توضیحات (DESCRIPTION)
فایلهای منطبق با الگوی مسیر (pathspec) را از ایندکس، یا از درخت کاری و ایندکس حذف میکند. دستور git rm فایلی را صرفاً از دایرکتوری کاری شما حذف نخواهد کرد. (هیچ گزینهای برای حذف فایل تنها از درخت کاری و در عین حال نگه داشتن آن در ایندکس وجود ندارد؛ اگر میخواهید این کار را انجام دهید از /bin/rm استفاده کنید.) فایلهایی که حذف میشوند باید دقیقاً با نوک شاخه یکسان باشند، و هیچ بهروزرسانی در محتویات آنها نباید در ایندکس آمادهسازی شده باشد، اگرچه این رفتار پیشفرض را میتوان با گزینه -f نادیده گرفت و تغییر داد. هنگامی که --cached مشخص شود، محتوای آمادهسازیشده باید با نوک شاخه یا فایل روی دیسک مطابقت داشته باشد، که امکان حذف فایل را تنها از ایندکس فراهم میسازد. هنگامی که sparse-checkout در حال استفاده است (به git-sparse-checkout(1) مراجعه کنید)، دستور git rm تنها مسیرهای درون الگوهای sparse-checkout را حذف خواهد کرد.
گزینهها (OPTIONS)
<pathspec>...
این دستور تنها مسیرهایی را حذف میکند که برای گیت شناختهشده هستند.
تطبیق الگوهای فایلی (globbing) در مرزهای دایرکتوری نیز انجام میشود. بنابراین با داشتن دو دایرکتوری d و d2، تفاوتی میان استفاده از git rm 'd*' و git rm 'd/*' وجود دارد، چرا که دستور اول تمامی دایرکتوری d2 را نیز حذف خواهد کرد.
برای جزئیات بیشتر، مدخل <pathspec> را در gitglossary(7) ببینید.
-f, --force
-n, --dry-run
-r
--
--cached
--ignore-unmatch
--sparse
-q, --quiet
--pathspec-from-file=<file>
--pathspec-file-nul
حذف فایلهای پاکشده از سیستمفایل (REMOVING FILES THAT HAVE DISAPPEARED FROM THE FILESYSTEM)
هیچ گزینهای در git rm برای حذف تنها مسیرهایی از ایندکس که از سیستمفایل ناپدید شدهاند وجود ندارد. با این حال، بسته به مورد استفاده، چندین روش برای انجام این کار وجود دارد.
استفاده از “git commit -a”
اگر قصد دارید کامیت بعدی شما تمام تغییرات فایلهای ردیابیشده در درخت کاری و تمام حذفهای فایلهایی که با rm (در مقایسه با git rm) از درخت کاری حذف شدهاند را ثبت کند، از git commit -a استفاده کنید، چرا که به طور خودکار تمامی حذفها را متوجه شده و ثبت میکند. همچنین میتوانید بدون کامیت کردن، با استفاده از git add -u به اثری مشابه دست یابید.
استفاده از “git add -A”
هنگام پذیرش یک بسته کد جدید (code drop) برای یک شاخه ارائهدهنده (vendor branch)، احتمالاً میخواهید هم حذف مسیرها و افزودن مسیرهای جدید و هم تغییرات مسیرهای موجود را ثبت کنید.
به طور معمول ابتدا با استفاده از این دستور، تمام فایلهای ردیابیشده را از درخت کاری حذف میکنید:
git ls-files -z | xargs -0 rm -f
و سپس کد جدید را در درخت کاری از حالت فشرده (untar) خارج میکنید. متناوباً میتوانید تغییرات را با rsync به درون درخت کاری همگامسازی کنید.
پس از آن، سادهترین روش برای ثبت تمام حذفها، افزودنها و تغییرات در درخت کاری عبارت است از:
git add -A
به git-add(1) مراجعه کنید.
روشهای دیگر (Other ways)
اگر تمام آنچه واقعاً میخواهید انجام دهید حذف فایلهایی از ایندکس است که دیگر در درخت کاری وجود ندارند (شاید به این دلیل که درخت کاری شما تغییرات ثبتنشده دارد و نمیتوانید از git commit -a استفاده کنید)، از دستور زیر استفاده کنید:
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
زیرماژولها (SUBMODULES)
تنها زیرماژولهایی که از یک gitfile استفاده میکنند (به این معنی که با نسخه گیت 1.7.8 یا جدیدتر کلون شدهاند) از درخت کاری حذف خواهند شد، زیرا مخزن آنها در دایرکتوری .git پروژه اصلی قرار دارد. اگر یک زیرماژول (یا یکی از زیرماژولهای تودرتو درون آن) همچنان از یک دایرکتوری .git استفاده میکند، git rm دایرکتوری git زیرماژول را به دایرکتوری git پروژه اصلی منتقل میکند تا تاریخچه زیرماژول حفظ شود. در صورت وجود، بخش submodule.<name> در فایل gitmodules(5) نیز حذف خواهد شد و تغییرات آن فایل آمادهسازی (staged) میشود (مگر اینکه از --cached یا -n استفاده شود).
یک زیرماژول زمانی بهروز تلقی میشود که HEAD آن با آنچه در ایندکس ثبت شده یکسان باشد، هیچ فایل ردیابیشدهای تغییر نیافته باشد، و هیچ فایل ردیابینشدهای که نادیده گرفته نشده باشد در درخت کاری زیرماژول وجود نداشته باشد. فایلهای نادیدهگرفتهشده غیرضروری تلقی میشوند و مانع از حذف درخت کاری یک زیرماژول نخواهند شد.
اگر فقط میخواهید نسخه محلی دریافتشده (local checkout) یک زیرماژول را بدون کامیت کردنِ حذف، از درخت کاری خود حذف کنید، در عوض از git-submodule(1) deinit استفاده نمایید. همچنین برای جزئیات مربوط به حذف زیرماژول، به gitsubmodules(7) مراجعه کنید.
مثالها (EXAMPLES)
git rm Documentation/\*.txt
توجه داشته باشید که در این مثال علامت ستاره * از دید شل نقلقول (اسکیپ) شده است؛ این کار به گیت، و نه شل، اجازه میدهد نام مسیرهای فایلها و زیردایرکتوریهای واقع در دایرکتوری Documentation/ را گسترش دهد.
git rm -f git-*.sh
اشکالات (BUGS)
هر بار که بهروزرسانی پروژه اصلی یک زیرماژول پرشده را حذف میکند (برای مثال هنگام جابجایی بین کامیتهای قبل و بعد از حذف)، یک نسخه کهنه از زیرماژول در مکان قبلی باقی میماند. حذف دایرکتوری قدیمی تنها زمانی امن است که از یک gitfile استفاده کند، چرا که در غیر این صورت تاریخچه زیرماژول نیز حذف خواهد شد. این مرحله با پیادهسازی بهروزرسانی بازگشتی زیرماژولها منسوخ خواهد شد.
همچنین ببینید (SEE ALSO)
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |