GIT-RM(1) راهنمای Git GIT-RM(1)

git-rm - حذف فایل‌ها از درخت کاری و ایندکس

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]
       [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]
       [--] [<pathspec>...]

فایل‌های منطبق با الگوی مسیر (pathspec) را از ایندکس، یا از درخت کاری و ایندکس حذف می‌کند. دستور git rm فایلی را صرفاً از دایرکتوری کاری شما حذف نخواهد کرد. (هیچ گزینه‌ای برای حذف فایل تنها از درخت کاری و در عین حال نگه داشتن آن در ایندکس وجود ندارد؛ اگر می‌خواهید این کار را انجام دهید از /bin/rm استفاده کنید.) فایل‌هایی که حذف می‌شوند باید دقیقاً با نوک شاخه یکسان باشند، و هیچ به‌روزرسانی در محتویات آن‌ها نباید در ایندکس آماده‌سازی شده باشد، اگرچه این رفتار پیش‌فرض را می‌توان با گزینه -f نادیده گرفت و تغییر داد. هنگامی که --cached مشخص شود، محتوای آماده‌سازی‌شده باید با نوک شاخه یا فایل روی دیسک مطابقت داشته باشد، که امکان حذف فایل را تنها از ایندکس فراهم می‌سازد. هنگامی که sparse-checkout در حال استفاده است (به git-sparse-checkout(1) مراجعه کنید)، دستور git rm تنها مسیرهای درون الگوهای sparse-checkout را حذف خواهد کرد.

<pathspec>...

فایل‌هایی که باید حذف شوند. می‌توان نام یک دایرکتوری ابتدایی را مشخص کرد (مانند dir برای حذف dir/file1 و dir/file2) تا تمامی فایل‌های موجود در دایرکتوری و به صورت بازگشتی تمام زیردایرکتوری‌ها حذف شوند، اما این کار نیازمند مشخص کردن صریح گزینه -r است.

این دستور تنها مسیرهایی را حذف می‌کند که برای گیت شناخته‌شده هستند.

تطبیق الگوهای فایلی (globbing) در مرزهای دایرکتوری نیز انجام می‌شود. بنابراین با داشتن دو دایرکتوری d و d2، تفاوتی میان استفاده از git rm 'd*' و git rm 'd/*' وجود دارد، چرا که دستور اول تمامی دایرکتوری d2 را نیز حذف خواهد کرد.

برای جزئیات بیشتر، مدخل <pathspec> را در gitglossary(7) ببینید.

-f, --force

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

-n, --dry-run

در عمل هیچ فایلی را حذف نمی‌کند؛ در عوض فقط نشان می‌دهد که آیا آن‌ها در ایندکس وجود دارند و آیا در غیر این صورت توسط دستور حذف می‌شدند یا خیر.

-r

در صورت مشخص شدن نام یک دایرکتوری ابتدایی، اجازه حذف بازگشتی را می‌دهد.

--

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

--cached

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

--ignore-unmatch

حتی اگر هیچ فایلی مطابقت نداشته باشد، با وضعیت خروج صفر (موفق) خارج می‌شود.

--sparse

به‌روزرسانی مدخل‌های ایندکس خارج از مخروط sparse-checkout را مجاز می‌کند. به طور معمول، git rm از به‌روزرسانی مدخل‌های ایندکسی که مسیر آن‌ها در مخروط sparse-checkout قرار نمی‌گیرد خودداری می‌کند. برای اطلاعات بیشتر git-sparse-checkout(1) را ببینید.

-q, --quiet

دستور git rm به طور معمول برای هر فایل حذف‌شده یک خط خروجی (به شکل دستور rm) تولید می‌کند. این گزینه آن خروجی را فرونشانی و مخفی می‌کند.

--pathspec-from-file=<file>

الگوی مسیر (pathspec) به جای آرگومان‌ها از طریق <file> ارسال می‌شود. اگر <file> دقیقاً - باشد، ورودی استاندارد استفاده می‌شود. عناصر pathspec با LF یا CR/LF از هم جدا می‌شوند. عناصر pathspec را می‌توان همان‌طور که برای متغیر پیکربندی core.quotePath توضیح داده شده است نقل‌قول کرد (به git-config(1) مراجعه کنید). همچنین به --pathspec-file-nul و گزینه سراسری --literal-pathspecs مراجعه کنید.

--pathspec-file-nul

تنها همراه با --pathspec-from-file معنادار است. عناصر pathspec با نویسه NUL جدا می‌شوند و سایر نویسه‌ها به صورت تحت‌اللفظی در نظر گرفته می‌شوند (شامل خطوط جدید و علامت‌های نقل‌قول).

هیچ گزینه‌ای در git rm برای حذف تنها مسیرهایی از ایندکس که از سیستم‌فایل ناپدید شده‌اند وجود ندارد. با این حال، بسته به مورد استفاده، چندین روش برای انجام این کار وجود دارد.

اگر قصد دارید کامیت بعدی شما تمام تغییرات فایل‌های ردیابی‌شده در درخت کاری و تمام حذف‌های فایل‌هایی که با rm (در مقایسه با git rm) از درخت کاری حذف شده‌اند را ثبت کند، از git commit -a استفاده کنید، چرا که به طور خودکار تمامی حذف‌ها را متوجه شده و ثبت می‌کند. همچنین می‌توانید بدون کامیت کردن، با استفاده از git add -u به اثری مشابه دست یابید.

هنگام پذیرش یک بسته کد جدید (code drop) برای یک شاخه ارائه‌دهنده (vendor branch)، احتمالاً می‌خواهید هم حذف مسیرها و افزودن مسیرهای جدید و هم تغییرات مسیرهای موجود را ثبت کنید.

به طور معمول ابتدا با استفاده از این دستور، تمام فایل‌های ردیابی‌شده را از درخت کاری حذف می‌کنید:

git ls-files -z | xargs -0 rm -f

و سپس کد جدید را در درخت کاری از حالت فشرده (untar) خارج می‌کنید. متناوباً می‌توانید تغییرات را با rsync به درون درخت کاری همگام‌سازی کنید.

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

git add -A

به git-add(1) مراجعه کنید.

اگر تمام آنچه واقعاً می‌خواهید انجام دهید حذف فایل‌هایی از ایندکس است که دیگر در درخت کاری وجود ندارند (شاید به این دلیل که درخت کاری شما تغییرات ثبت‌نشده دارد و نمی‌توانید از git commit -a استفاده کنید)، از دستور زیر استفاده کنید:

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

تنها زیرماژول‌هایی که از یک 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) مراجعه کنید.

git rm Documentation/\*.txt

تمامی فایل‌های *.txt موجود در دایرکتوری Documentation و هر یک از زیردایرکتوری‌های آن را از ایندکس حذف می‌کند.

توجه داشته باشید که در این مثال علامت ستاره * از دید شل نقل‌قول (اسکیپ) شده است؛ این کار به گیت، و نه شل، اجازه می‌دهد نام مسیرهای فایل‌ها و زیردایرکتوری‌های واقع در دایرکتوری Documentation/ را گسترش دهد.

git rm -f git-*.sh

از آنجا که این مثال به شل اجازه می‌دهد علامت ستاره را بسط دهد (یعنی شما فایل‌ها را صراحتاً فهرست می‌کنید)، فایل subdir/git-foo.sh را حذف نمی‌کند.

هر بار که به‌روزرسانی پروژه اصلی یک زیرماژول پرشده را حذف می‌کند (برای مثال هنگام جابجایی بین کامیت‌های قبل و بعد از حذف)، یک نسخه کهنه از زیرماژول در مکان قبلی باقی می‌ماند. حذف دایرکتوری قدیمی تنها زمانی امن است که از یک gitfile استفاده کند، چرا که در غیر این صورت تاریخچه زیرماژول نیز حذف خواهد شد. این مرحله با پیاده‌سازی به‌روزرسانی بازگشتی زیرماژول‌ها منسوخ خواهد شد.

git-add(1)

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

2026-06-29 Git 2.55.0