Git RM چیست؟
یک سوال متداول در هنگام شروع کار با Git، این است که "چگونه به Git بگوییم که دیگر یک فایل (یا فایل ها) را دنبال نکند؟" از دستور git rm برای حذف فایل ها از مخزن Git استفاده می شود. می توان آن را بر عکس دستور git add در نظر گرفت.
بررسی اجمالی Git rm
از دستور git rm می توان برای جدا کردن یک فایل یا مجموعه ای از فایل ها استفاده کرد. عملکرد اصلی git rm حذف فایل های پیگیری شده از فهرست Git است. افزون بر این، از git rm می توان برای حذف فایل ها از staging index و working directory استفاده کرد. گزینه ای برای حذف فایل به تنهایی از working directory
وجود ندارد. فایل هایی که در حال کار هستند باید با فایل های HEAD فعلی یکسان باشند. اگر بین نسخه ی HEAD یک فایل و staging index یا نسخه ی working tree، اختلاف وجود داشت، Git حذف را مسدود می کند. این مسدود کردن، یک مکانیسم ایمنی برای جلوگیری از حذف تغییرهای در حال انجام است.
توجه داشته باشید که git rm شاخه ها را از بین نمی برد. پیشنهاد می کنیم درباره استفاده از شاخه های git اطلاعات بیشتری به دست آورید.
کاربرد
<file>…
عبارت بالا، فایل هایی را که می خواهیم حذف کنیم، مشخص می کند. مقدار آن یک فایل تنها، یک لیست فضای محدود از فایل ها مثل file1 file2 file3
یا یک فایل wildcard glob (~./directory/*)
است.
f
--force
گزینه f-
برای لغو بررسی امنیتی است. Git، برای اطمینان از تطابق فایل های HEAD با محتوای فعلی در staging index
و working directory
، از آن استفاده می کند.
-n
--dry-run
گزینه ی "dry run
" یک محافظ است که دستور git rm را اجرا می کند اما در واقع فایل ها را حذف نمی کند. در عوض، فایل هایی را که می خواست حذف کند، در خروجی دریافت خواهد کرد.
-r
گزینه ی r-
مخفف "recursive" است. هنگام کار در حالت بازگشتی، git rm یک Directory و تمام محتوای آن را حذف می کند.
--
گزینه ی جداساز برای تشخیص صریح بین لیستی از نام فایل ها و پارامتر های منتقل شده به git rm استفاده می شود. این گزینه در صورتی مفید است که برخی از نام فایل ها، syntax ای داشته باشند که ممکن است با گزینه های دیگر اشتباه گرفته شود.
--cached
گزینه ی cached مشخص می کند که حذف باید فقط در staging index انجام شود. فایل های working directory به تنهایی باقی می مانند.
--ignore-unmatch
این امر باعث می شود تا دستور با مقدار وضعیت صفر (0) خارج شود، حتی اگر هیچ فایلی تطابق نداشته باشد. این یک کد وضعیت سطح Unix است. کد صفر (0) بیانگر موفقیت آمیز بودن دستور است. گزینه ی ignore-unmatch--
هنگام استفاده از git rm به عنوان بخشی از یک shell script بزرگ تر که نیاز به شکست دارد، مفید است.
-q
--quiet
گزینه ی quiet، خروجی دستور git rm را مخفی می کند. این دستور به طور معمول برای هر فایل حذف شده، یک خط در خروجی می دهد.
شیوه ی undo کردن git rm
اجرای دستور git rm، یک به روز رسانی دائمی نیست. این دستور، staging index
و working directory
را به روز می کند. این تغییرها تا ایجاد Commit جدید و اضافه شدن تغییرها به تاریخچه ی Commit ادامه نخواهد یافت. یعنی می توان تغییرها را با استفاده از دستورات معمول Git "لغو" (undone) کرد.
git reset HEAD
با استفاده از reset
، staging index
و working directory
را به Commit HEAD برگردانید. با این کار دستور git rm را undo خواهید کرد.
git checkout .
یک checkout نیز همان اثر را خواهد داشت و آخرین نسخه ی فایل را از HEAD، بازیابی می کند.
در صورت اجرای git rm و انجام یک Commit جدید که باعث برداشته شدن موارد قبل می شود، می توان از git reflog برای پیدا کردن یک منبع که قبل از اجرای git rm بوده است، استفاده کرد. برای کسب اطلاعات بیشتر درباره ی استفاده از git reflog، می توانید به مستند آن مراجعه کنید.
بحث و گفت وگو
پارامتر <file> که به دستور داده می شود، مسیرهای دقیق، الگوهای glob فایل wildcard یا نام دقیق Directory است. این دستور فقط مسیرهای Commit شده جاری در مخزن Git را حذف می کند.
فایل Wildcard در کل Directory ها تطابق دارد. این مهم است که هنگام استفاده از Wildcard glob، مواظب باشید. این مثال ها را در نظر بگیرید: directory/*
و directory*
. مثال اول تمام فایل های فرعی مسیر directory/
را حذف می کند. در حالی که مثال دوم همه ی مسیر های خواهر و برادر مانند directory1 directory2
directory_whatever
را حذف می کند، هرچند ممکن است نتیجه ی غیر منتظره ای داشته باشد.
Scope (دامنه) git rm
دستور git rm فقط در شاخه ی جاری کار می کند. رویداد حذف فقط در staging index و working directory اعمال می شود. حذف فایل در تاریخچه ی مخزن تا ایجاد Commit جدید ادامه پیدا نمی کند.
استفاده از git rm به جای rm
وقتی که یک دستور rm shell معمولی روی فایلی اجرا شود، مخزن Git آن را تشخیص می دهد. این working directory
را به روز می کند تا حذف را منعکس کند. با حذف فایل، staging index به روز نمی شود. یک دستور git add اضافی باید در مسیرهای فایل حذف شده اجرا شود تا تغییرها در staging index
اضافه شود. دستور git rm یک میان بر است که از راه آن، staging index
و working directory
را با حذف فایل، به روز می کند.
مثال ها
git rm Documentation/\*.txt
این مثال با استفاده از یک glob فایل wildcard، همه فایل های *.txt
که فرزندان مسیر Documentation و هر یک از زیر شاخه های آن هستند، را حذف می کند.
توجه داشته باشید که در این مثال، ستاره (*) با استفاده از / (slash)، escape شده است. این محافظی است که از گسترش shell wildcard جلوگیری می کند. سپس wildcard نام مسیر های فایل ها و زیر شاخه ها را در زیر Directory Documentation/
، گسترش می دهد.
git rm -f git-*.sh
این مثال از گزینه ی force استفاده می کند و تمام فایل های wildcard git-*.sh
را هدف قرار می دهد. گزینه ی force به طور واضح فایل های هدف را از staging index
و working directory
، حذف می کند.
شیوه ی حذف فایل های دیگر در filesystem
همان طور که در بخش "استفاده از git rm به جای rm" گفته شد، git rm در واقع یک دستور راحت است که ترکیبی از rm shell استاندارد و git add است تا یک فایل را از working directory حذف کند و آن را به staging index گسترش دهد. در صورتی که چندین فایل فقط با استفاده از دستور استاندارد shell rm حذف شده اند، یک مخزن می تواند به یک وضعیت دست و پا گیر یا سنگین تبدیل شود.
اگر قصد دارید همه ی فایل های حذف شده به عنوان بخشی از Commit بعدی ثبت شود، git commit -a در آماده سازی Commit بعدی، تمام رویدادهای حذف را به staging index اضافه می کند.
با این حال، اگر قصد حذف کامل فایل های حذف شده با shell rm را دارید، از دستور زیر استفاده کنید:
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
این دستور لیستی از فایل های حذف شده را از working directory ایجاد می کند و لیست آن را برای git rm –cached، آماده می کند که staging index را به روز کند.
منبع
https://www.atlassian.com/git/tutorials/undoing-changes/git-rm