GIT-LFS-PRUNE(1)   GIT-LFS-PRUNE(1)

git-lfs-prune - حذف فایل‌های قدیمی LFS از حافظه محلی

git lfs prune [گزینه‌ها]

نسخه‌های محلی فایل‌های LFS قدیمی را حذف کرده و بدین ترتیب فضای دیسک را آزاد می‌کند. عملکرد Prune به این صورت است که تمام اشیاء ذخیره‌شده محلی را شمارش کرده و سپس هر موردی را که حداقل توسط یکی از موارد زیر ارجاع داده نشده باشد، حذف می‌کند:

•نسخه بررسی‌شده فعلی (current checkout)
•تمام stashهای موجود
•یک 'شاخه اخیر'؛ به بخش «فایل‌های اخیر (RECENT FILES)» مراجعه کنید
•یک 'کامیت اخیر' در شاخه فعلی یا شاخه‌های اخیر؛ به بخش «فایل‌های اخیر (RECENT FILES)» مراجعه کنید
•کامیتی که ارسال (push) نشده است؛ به بخش «فایل‌های ارسال‌نشده LFS (UNPUSHED LFS FILES)» مراجعه کنید
•هر نسخه بررسی‌شده دیگری در درخت‌های کاری؛ به git-worktree(1) مراجعه کنید

به طور کلی، prune فایل‌هایی را حذف می‌کند که در حال حاضر از آن‌ها استفاده نمی‌کنید و 'اخیر' نیستند، مشروط بر اینکه ارسال شده باشند؛ به این معنی که نسخه محلی تنها نسخه موجود نباشد.

لاگ ارجاعات (reflog) در نظر گرفته نمی‌شود و فقط کامیت‌ها بررسی می‌شوند. بنابراین اشیاء LFS که فقط توسط کامیت‌های یتیم ارجاع داده شده‌اند همیشه حذف می‌شوند.

نکته: اگر چندین مخزن مختلف دارید که از یک دایرکتوری ذخیره‌سازی سفارشی مشترک استفاده می‌کنند، نباید git lfs prune را اجرا کنید؛ برای جزئیات بیشتر درباره گزینه lfs.storage به git-lfs-config(5) مراجعه کنید.

در پیکربندی Git یا در یک فایل .lfsconfig، می‌توانید lfs.fetchexclude را با فهرستی از مسیرها که با کاما از هم جدا شده‌اند تنظیم کنید. اگر lfs.fetchexclude تعریف شده باشد، آن‌گاه هر فایل Git LFS که مسیر آن با یکی از موارد موجود در آن فهرست مطابقت داشته باشد هرس خواهد شد، مگر اینکه توسط یک stash یا یک کامیت ارسال‌نشده ارجاع داده شده باشد. تطبیق مسیرها با استفاده از تطبیق نویسه‌های عمومی (wildcard) مطابق با gitignore(5) انجام می‌شود.

-d, --dry-run

عملاً چیزی را حذف نمی‌کند، فقط گزارش می‌دهد که چه کارهایی انجام می‌شد.

-f, --force

تمام اشیاء به جز اشیاء ارسال‌نشده، از جمله اشیاء مورد نیاز برای ارجاعات فعلی بررسی‌شده را هرس می‌کند. مستلزم گزینه --recent است.

--recent

حتی اشیایی را که معمولاً توسط گزینه‌های پیکربندی مشخص‌شده در ادامه در بخش «فایل‌های اخیر» نگهداری می‌شوند، هرس می‌کند.

-c, --verify-remote

پیش از حذف، با مخزن دوردست (remote) ارتباط برقرار کرده و بررسی می‌کند که نسخه‌هایی از فایل‌های در دسترس که قرار است حذف شوند، قطعاً در دوردست وجود داشته باشند. به بخش «تایید دوردست (VERIFY REMOTE)» مراجعه کنید.

--no-verify-remote

در صورتی که lfs.pruneverifyremotealways در تنظیمات فعال شده باشد، تایید دوردست را غیرفعال می‌کند. به بخش «تایید دوردست (VERIFY REMOTE)» مراجعه کنید.

--verify-unreachable

هنگام استفاده از --verify-remote، با مخزن دوردست ارتباط برقرار کرده و اشیاء غیرقابل‌دسترس را نیز بررسی می‌کند. به بخش «تایید دوردست (VERIFY REMOTE)» مراجعه کنید.

--no-verify-unreachable

در صورتی که lfs.pruneverifyunreachablealways در تنظیمات فعال شده باشد، تایید دوردست فایل‌های غیرقابل‌دسترس را غیرفعال می‌کند. به بخش «تایید دوردست (VERIFY REMOTE)» مراجعه کنید.

--when-unverified=<halt,continue>

زمانی که --verify-remote نتواند شیئی را در دوردست تایید کند، اجرای عملیات متوقف می‌شود (halt) یا حذف اشیاء تاییدشده ادامه می‌یابد (continue). به بخش «تایید دوردست (VERIFY REMOTE)» مراجعه کنید.

-v, --verbose

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

دستور Prune فایل‌های LFS ارجاع‌شده توسط کامیت‌های 'اخیر' را حذف نمی‌کند، تا در صورت تمایل بتوانید مجدداً بدون نیاز به دانلود از آن‌ها استفاده کنید. تعریف 'اخیر' برگرفته از تعریفی است که توسط git-lfs-fetch(1) برای دانلود اشیاء اخیر با گزینه --recent استفاده می‌شود، همراه با یک آفست از تعدادی روز (به صورت پیش‌فرض ۳ روز) برای اطمینان از اینکه فایل‌های دانلودشده همیشه برای چند روز نگهداری می‌شوند.

تنظیمات git-config(1) که این رفتار را کنترل می‌کنند عبارتند از:

lfs.pruneoffsetdays

تعداد روزهای اضافی اضافه‌شده به تنظیمات واکشی اخیر هنگام استفاده از آن‌ها برای تصمیم‌گیری در مورد زمان هرس. بنابراین برای اینکه یک ارجاع به اندازه کافی برای هرس شدن قدیمی در نظر گرفته شود، باید به اندازه این تعداد روز از قدیمی‌ترین ارجاعی که از طریق git lfs fetch --recent دانلود می‌شود، قدیمی‌تر باشد. فقط زمانی استفاده می‌شود که تنظیمات مربوط به 'days' برای fetch recent غیرصفر باشد. پیش‌فرض ۳ روز است.

lfs.fetchrecentrefsdays, lfs.fetchrecentremoterefs, lfs.fetchrecentcommitsdays

این موارد معنایی مشابه با git-lfs-fetch(1) همراه با گزینه --recent دارند و به عنوان پایه‌ای برای آفست بالا استفاده می‌شوند. هر چیزی که خارج از این بازه آفست‌شده قرار گیرد، به اندازه کافی برای هرس شدن قدیمی در نظر گرفته می‌شود. اگر مقدار روز صفر باشد، آن شرط به هیچ‌وجه برای نگهداری اشیاء استفاده نمی‌شود و آن‌ها هرس خواهند شد.

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

برای تشخیص اینکه آیا یک فایل LFS ارسال (push) شده است یا خیر، تفاوت بین ارجاعات محلی و دوردست را بررسی می‌کنیم؛ در جاهایی که ارجاع محلی جلوتر باشد، هر فایل LFS ارجاع‌شده در آن کامیت‌ها ارسال‌نشده است و حذف نخواهد شد. این روش کار می‌کند زیرا قلاب pre-push مربوط به LFS همیشه اطمینان حاصل می‌کند که فایل‌های LFS قبل از به‌روزرسانی شاخه دوردست، ارسال شده باشند.

برای اینکه بدانید کدام دوردست برای مقاصد هرس کردن به عنوان 'ارسال‌شده' در نظر گرفته می‌شود، به بخش «مخزن دوردست پیش‌فرض (DEFAULT REMOTE)» مراجعه کنید.

گزینه --verify-remote با مخزن دوردست ارتباط برقرار می‌کند تا اطمینان حاصل کند هر فایل در دسترس LFS که قرار است حذف شود، قبل از حذف واقعی دارای نسخه در دوردست باشد.

معمولاً بررسی انجام‌شده توسط بخش «فایل‌های ارسال‌نشده LFS» برای اطمینان از ارسال فایل‌ها کافی است، اما اگر می‌خواهید با صرف هزینه پردازشی بیشتر اطمینان مضاعف حاصل کنید، می‌توانید کاری کنید که prune واقعاً با API دوردست ارتباط برقرار کرده و وجود فایل‌هایی را که می‌خواهید به صورت محلی حذف کنید بررسی نماید. برای آگاهی از اینکه کدام دوردست بررسی می‌شود، به بخش «مخزن دوردست پیش‌فرض (DEFAULT REMOTE)» مراجعه کنید.

می‌توانید با تنظیم lfs.pruneverifyremotealways روی true این رفتار را به حالت پیش‌فرض تبدیل کنید.

علاوه بر هزینه پردازشی ارتباط با مخزن دوردست، استفاده از این گزینه همچنین نیازمند آن است که prune بین فایل‌های کاملاً غیرقابل‌دسترس (مانند فایل‌هایی که به نمایه اضافه شده‌اند اما هرگز کامیت نشده‌اند، یا فقط توسط کامیت‌های یتیم ارجاع داده شده‌اند) و فایل‌هایی که هنوز ارجاع داده می‌شوند اما توسط کامیت‌های قابل هرس هستند، تفاوت قائل شود. این امر باعث می‌شود فرآیند prune زمان بیشتری ببرد.

اگر می‌خواهید اشیاء غیرقابل‌دسترس را نیز تایید کنید، گزینه --verify-unreachable را تنظیم نمایید.

می‌توانید با تنظیم lfs.pruneverifyunreachablealways روی true بررسی اشیاء غیرقابل‌دسترس را به صورت پیش‌فرض فعال کنید.

به طور پیش‌فرض، اگر فایلی قابل تایید نباشد، --verify-remote اجرای عملیات را متوقف می‌کند. گزینه --when-unverified=continue را تنظیم کنید تا اجرا متوقف نشود بلکه حذف تمامی اشیاء قابل تایید ادامه یابد.

هنگام شناسایی «فایل‌های ارسال‌نشده LFS» و انجام «تایید دوردست»، معمولاً از یک دوردست واحد یعنی 'origin' به عنوان ارجاع استفاده می‌شود. این دوردست معتبر و رسمی تلقی می‌شود؛ حتی اگر از چندین دوردست استفاده می‌کنید، احتمالاً می‌خواهید نسخه‌های محلی خود را تا زمانی که به آن دوردست نرسیده‌اند نگه دارید. 'origin' به طور پیش‌فرض استفاده می‌شود زیرا معمولاً یک مخزن مرکزی اصلی است، یا انشعاب (fork) شما از آن - در هر دو حالت یک نسخه پشتیبان دوردست معتبر از کار شماست. اگر origin وجود نداشته باشد، به طور پیش‌فرض هیچ چیزی هرس نخواهد شد زیرا همه چیز به عنوان 'ارسال‌نشده' تلقی می‌شود.

می‌توانید مخزن دوردست را از طریق git config تغییر دهید: lfs.pruneremotetocheck. این مقدار را روی نام دوردست دیگری تنظیم کنید تا به جای 'origin' آن مورد بررسی شود.

git-lfs-fetch(1), gitignore(5).

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