| GIT-MAINTENANCE(1) | دستورات عمومی کاربر | GIT-MAINTENANCE(1) |
نام (NAME)
git-maintenance - اجرای وظایف بهینهسازی دادههای مخزن گیت
خلاصه دستور (SYNOPSIS)
git maintenance run [<options>] git maintenance start [--scheduler=<scheduler>] git maintenance (stop|register|unregister) [<options>] git maintenance is-needed [<options>]
توضیحات (DESCRIPTION)
اجرای وظایف جهت بهینهسازی دادههای مخزن گیت، افزایش سرعت سایر دستورات گیت و کاهش فضای ذخیرهسازی مورد نیاز برای مخزن.
دستورات گیت که دادهها را به مخزن اضافه میکنند، مانند git add یا git fetch، برای یک تجربه کاربری پاسخگو بهینهسازی شدهاند. این دستورات زمانی را صرف بهینهسازی دادههای گیت نمیکنند، زیرا چنین بهینهسازیهایی متناسب با اندازه کل مخزن مقیاسپذیر هستند، در حالی که این دستورات کاربری هر کدام یک عملیات نسبتاً کوچک را انجام میدهند.
دستور git maintenance انعطافپذیری لازم را برای چگونگی بهینهسازی مخزن گیت فراهم میکند.
زیردستورها (SUBCOMMANDS)
run
start
stop
register
زیردستور register همچنین در صورتی که مقدار پیکربندی maintenance.strategy پیشتر تنظیم نشده باشد، آن را روی incremental تنظیم میکند. راهبرد incremental از زمانبندی زیر برای هر وظیفه نگهداری استفاده میکند:
دستور git maintenance register همچنین با تنظیم maintenance.auto = false در مخزن جاری، نگهداری پیشزمینه را غیرفعال میکند. این تنظیم پیکربندی پس از اجرای دستور git maintenance unregister نیز باقی خواهد ماند.
unregister
زیردستور unregister اگر مخزن جاری از قبل ثبت نشده باشد، خطایی گزارش خواهد کرد. از گزینه --force استفاده کنید تا حتی زمانی که مخزن جاری ثبت نشده است، وضعیت موفقیتآمیز بازگردانده شود.
is-needed
اگر یک یا چند گزینه --task مشخص شده باشد، آن وظایف به همان ترتیب بررسی میشوند. در غیر این صورت، وظایف بر اساس اینکه کدام گزینههای پیکربندی maintenance.<task>.enabled برابر با true هستند تعیین میشوند. بهطور پیشفرض، فقط maintenance.gc.enabled برابر با true است.
وظایف (TASKS)
commit-graph
prefetch
این کار برای جلوگیری از اختلال در شاخههای ردیابی از دور انجام میشود. کاربران نهایی انتظار دارند این ارجاعات بدون تغییر باقی بمانند مگر اینکه خودشان یک fetch را آغاز کنند. با این حال، با وظیفه پیشواکشی (prefetch)، اشیاء لازم برای تکمیل یک fetch واقعی در آینده از قبل دریافت شده و fetch واقعی را سریعتر میکند. در حالت ایدهآل، این عملیات فقط به یک بهروزرسانی در مجموعهای از شاخههای ردیابی از دور بدون هیچگونه انتقال شیء تبدیل خواهد شد.
پیکربندی remote.<name>.skipFetchAll میتواند برای مستثنی کردن یک ریموت خاص از پیشواکشی استفاده شود.
gc
loose-objects
اندازه دسته بهطور پیشفرض پنجاه هزار شیء است تا از طولانی شدن بیش از حد کار در مخزنی با اشیاء سست زیاد جلوگیری شود. از گزینه پیکربندی maintenance.loose-objects.batchSize برای تنظیم این اندازه استفاده کنید، از جمله مقدار 0 برای حذف محدودیت.
وظیفه gc اشیاء غیرقابل دسترس را به عنوان اشیاء سست مینویسد تا در مرحله بعدی پاکسازی شوند، تنها در صورتی که دوباره به یک فایل پک اضافه نشوند؛ به همین دلیل توصیه نمیشود که هر دو وظیفه loose-objects و gc را همزمان فعال کنید.
incremental-repack
pack-refs
reflog-expire
rerere-gc
worktree-prune
گزینهها (OPTIONS)
--auto
--schedule
--quiet
--task=<task>
--scheduler=auto|crontab|systemd-timer|launchctl|schtasks
عیبیابی (TROUBLESHOOTING)
دستور git maintenance برای سادهسازی الگوهای نگهداری مخزن طراحی شده است و در عین حال زمان انتظار کاربر را در طول دستورات گیت به حداقل میرساند. انواع گزینههای پیکربندی برای سفارشیسازی این فرآیند در دسترس هستند. گزینههای پیشفرض نگهداری بر روی عملیاتی تمرکز دارند که به سرعت تکمیل میشوند، حتی در مخازن بزرگ.
ممکن است کاربران در مواردی متوجه شوند که وظایف زمانبندیشده نگهداری به همان تناوبی که در نظر گرفته شده بود اجرا نمیشوند. هر دستور git maintenance run یک قفل بر روی پایگاهداده اشیاء مخزن ایجاد میکند، و این امر مانع از اجرای سایر دستورات همزمان git maintenance run روی همان مخزن میشود. بدون این تدبیر امنیتی، فرآیندهای همزمان میتوانند مخزن را در وضعیتی غیرقابل پیشبینی رها کنند.
زمانبندی نگهداری پسزمینه فرآیندهای git maintenance run را بهصورت ساعتی اجرا میکند. هر اجرا وظایف "hourly" (ساعتی) را اجرا میکند. در نیمهشب، آن فرآیند وظایف "daily" (روزانه) را نیز اجرا میکند. در نیمهشب اولین روز هفته، آن فرآیند وظایف "weekly" (هفتگی) را نیز اجرا میکند. یک فرآیند واحد بر روی هر مخزن ثبتشده تکرار میشود و وظایف زمانبندیشده را برای آن تناوب زمانی انجام میدهد. فرآیندها در یک دقیقه تصادفی از هر ساعت برای هر کلاینت زمانبندی میشوند تا بار ترافیکی که ممکن است چند کلاینت ایجاد کنند (مثلاً ناشی از پیشواکشی) پخش شود. بسته به تعداد مخازن ثبتشده و اندازه آنها، این فرآیند ممکن است بیش از یک ساعت طول بکشد. در این حالت، چندین دستور git maintenance run ممکن است بهطور همزمان بر روی یک مخزن اجرا شوند و بر سر قفل پایگاهداده اشیاء تداخل ایجاد کنند. این امر منجر به عدم اجرای یکی از دو وظیفه میشود.
اگر متوجه شدید که تکمیل برخی از بازههای نگهداری بیش از یک ساعت طول میکشد، کاهش پیچیدگی وظایف نگهداری خود را مد نظر قرار دهید. برای مثال، وظیفه gc بسیار کندتر از وظیفه incremental-repack است. با این حال، این امر به بهای یک پایگاهداده اشیاء کمی بزرگتر تمام میشود. انتقال وظایف سنگینتر را به تناوبهای زمانی کمتر مد نظر قرار دهید.
کاربران باتجربه ممکن است زمانبندی وظایف نگهداری خود را با استفاده از برنامهای متفاوت از آنچه از طریق git maintenance start و گزینههای پیکربندی گیت موجود است در نظر بگیرند. این کاربران باید از قفل پایگاهداده اشیاء و نحوه رفتار دستورات همزمان git maintenance run آگاه باشند. علاوه بر این، دستور git gc نباید با دستورات git maintenance run ترکیب شود. دستور git gc پایگاهداده اشیاء را تغییر میدهد اما قفل را به همان روشی که git maintenance run انجام میدهد اعمال نمیکند. در صورت امکان، از git maintenance run --task=gc بهجای git gc استفاده کنید.
بخشهای زیر سازوکارهای تعبیهشده برای اجرای نگهداری پسزمینه توسط git maintenance start و نحوه سفارشیسازی آنها را شرح میدهند.
نگهداری پسزمینه در سیستمهای پازیکس (POSIX)
سازوکار استاندارد برای زمانبندی وظایف پسزمینه در سیستمهای POSIX ابزار cron(8) است. این ابزار دستورات را بر اساس یک زمانبندی مشخص اجرا میکند. فهرست جاری وظایف زمانبندیشده توسط کاربر را میتوان با اجرای crontab -l پیدا کرد. زمانبندی نوشتهشده توسط git maintenance start شبیه به این است:
# BEGIN GIT MAINTENANCE SCHEDULE # The following schedule was created by Git # Any edits made in this region might be # replaced in the future by a Git command. 0 1-23 * * * "/<path>/git" --exec-path="/<path>" for-each-repo --config=maintenance.repo maintenance run --schedule=hourly 0 0 * * 1-6 "/<path>/git" --exec-path="/<path>" for-each-repo --config=maintenance.repo maintenance run --schedule=daily 0 0 * * 0 "/<path>/git" --exec-path="/<path>" for-each-repo --config=maintenance.repo maintenance run --schedule=weekly # END GIT MAINTENANCE SCHEDULE
کامنتها به عنوان ناحیهای برای نشانهگذاری زمانبندی نوشتهشده توسط گیت استفاده میشوند. هرگونه تغییر در این ناحیه با git maintenance stop کاملاً حذف شده یا با git maintenance start بازنویسی میشود.
ورودی crontab مسیر کامل فایل اجرایی git را مشخص میکند تا اطمینان حاصل شود که دستور git اجراشده همان دستوری است که git maintenance start با آن صادر شده است، مستقل از متغیر PATH. اگر همان کاربر git maintenance start را با چندین فایل اجرایی Git اجرا کند، فقط آخرین فایل اجرایی استفاده میشود.
این دستورات از git for-each-repo --config=maintenance.repo برای اجرای git maintenance run --schedule=<frequency> روی هر مخزن فهرستشده در گزینه پیکربندی چندمقداری maintenance.repo استفاده میکنند. این مقادیر معمولاً از پیکربندی سراسری ویژه کاربر بارگیری میشوند. سپس فرآیند git maintenance با استفاده از گزینههای پیکربندی maintenance.<task>.schedule تعیین میکند که کدام وظایف نگهداری برای اجرا در هر مخزن با هر <frequency> پیکربندی شدهاند. این مقادیر از مقادیر پیکربندی سراسری یا مخزن بارگیری میشوند.
اگر مقادیر پیکربندی برای دستیابی به برنامه نگهداری پسزمینه مورد نظر شما کافی نیست، میتوانید برنامه زمانبندی خود را ایجاد کنید. اگر crontab -e را اجرا کنید، یک ویرایشگر با زمانبندی cron ویژه کاربر شما بارگیری میشود. در آن ویرایشگر، میتوانید خطوط زمانبندی خود را اضافه کنید. میتوانید با اقتباس از زمانبندی پیشفرض فهرستشده در بالا شروع کنید، یا میتوانید مستندات crontab(5) را برای تکنیکهای پیشرفته زمانبندی مطالعه کنید. لطفاً از تکنیکهای مسیر کامل و --exec-path از زمانبندی پیشفرض استفاده کنید تا مطمئن شوید که باینریهای صحیح را در زمانبندی خود اجرا میکنید.
نگهداری پسزمینه در سیستمهای لینوکس مجهز به SYSTEMD
در حالی که لینوکس از cron پشتیبانی میکند، بسته به توزیع، ممکن است cron یک بسته اختیاری باشد و لزوماً نصب نشده باشد. در توزیعهای مدرن لینوکس، تایمرهای systemd در حال جایگزینی آن هستند.
اگر تایمرهای کاربری systemd در دسترس باشند، به عنوان جایگزین cron استفاده خواهند شد.
در این حالت، git maintenance start واحدهای تایمر کاربری systemd را ایجاد کرده و تایمرها را شروع میکند. فهرست جاری وظایف زمانبندیشده کاربر را میتوان با اجرای systemctl --user list-timers پیدا کرد. تایمرهای نوشتهشده توسط git maintenance start مشابه این هستند:
$ systemctl --user list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Thu 2021-04-29 19:00:00 CEST 42min left Thu 2021-04-29 18:00:11 CEST 17min ago git-maintenance@hourly.timer git-maintenance@hourly.service Fri 2021-04-30 00:00:00 CEST 5h 42min left Thu 2021-04-29 00:00:11 CEST 18h ago git-maintenance@daily.timer git-maintenance@daily.service Mon 2021-05-03 00:00:00 CEST 3 days left Mon 2021-04-26 00:00:11 CEST 3 days ago git-maintenance@weekly.timer git-maintenance@weekly.service
برای هر گزینه --schedule=<frequency> یک تایمر ثبت میشود.
تعریف واحدهای systemd را میتوان در فایلهای زیر بررسی کرد:
~/.config/systemd/user/git-maintenance@.timer ~/.config/systemd/user/git-maintenance@.service ~/.config/systemd/user/timers.target.wants/git-maintenance@hourly.timer ~/.config/systemd/user/timers.target.wants/git-maintenance@daily.timer ~/.config/systemd/user/timers.target.wants/git-maintenance@weekly.timer
دستور git maintenance start این فایلها را بازنویسی کرده و تایمر را مجدداً با systemctl --user راهاندازی میکند، بنابراین هرگونه سفارشیسازی باید با ایجاد یک فایل drop-in انجام شود، یعنی یک فایل با پسوند .conf در دایرکتوری ~/.config/systemd/user/git-maintenance@.service.d.
دستور git maintenance stop تایمرهای کاربری systemd را متوقف کرده و فایلهای ذکرشده در بالا را حذف میکند.
برای جزئیات بیشتر به systemd.timer(5) مراجعه کنید.
نگهداری پسزمینه در سیستمهای مکاواس (MACOS)
در حالی که macOS از نظر فنی از cron پشتیبانی میکند، استفاده از crontab -e نیاز به دسترسیهای بالاتر دارد و فرآیند اجراشده زمینه کاربری کامل ندارد. بدون یک زمینه کاربری کامل، Git و دستیارهای اعتبارنامهای آن نمیتوانند به اطلاعات هویتی ذخیرهشده دسترسی پیدا کنند، بنابراین برخی از وظایف نگهداری کار نخواهند کرد.
در عوض، git maintenance start با ابزار launchctl تعامل برقرار میکند، که روش پیشنهادی برای زمانبندی کارهای زماندار در macOS است. زمانبندی نگهداری از طریق git maintenance (start|stop) به برخی از قابلیتهای launchctl نیاز دارد که فقط در macOS 10.11 یا بالاتر در دسترس هستند.
وظایف زمانبندیشده ویژه کاربر شما به صورت فایلهای .plist با فرمت XML در ~/Library/LaunchAgents/ ذخیره میشوند. با استفاده از دستور زیر میتوانید وظایفی را که در حال حاضر ثبت شدهاند مشاهده کنید:
$ ls ~/Library/LaunchAgents/org.git-scm.git* org.git-scm.git.daily.plist org.git-scm.git.hourly.plist org.git-scm.git.weekly.plist
برای هر گزینه --schedule=<frequency> یک وظیفه ثبت میشود. برای بررسی نحوه توصیف هر زمانبندی توسط قالب XML، یکی از این فایلهای .plist را در یک ویرایشگر باز کنید و عنصر <array> را پس از عنصر <key>StartCalendarInterval</key> بررسی نمایید.
دستور git maintenance start این فایلها را بازنویسی کرده و وظایف را مجدداً در launchctl ثبت میکند، بنابراین هرگونه سفارشیسازی باید با ایجاد فایلهای .plist خودتان با نامهای مجزا انجام شود. به طور مشابه، دستور git maintenance stop وظایف را از launchctl لغو ثبت کرده و فایلهای .plist را حذف میکند.
برای ایجاد سفارشیسازیهای پیشرفتهتر در وظایف پسزمینه خود، جهت کسب اطلاعات بیشتر به launchctl.plist(5) مراجعه کنید.
نگهداری پسزمینه در سیستمهای ویندوز (WINDOWS)
ویندوز از cron پشتیبانی نمیکند و در عوض سیستم اختصاصی خود را برای زمانبندی وظایف پسزمینه دارد. دستور git maintenance start از دستور schtasks برای ارسال وظایف به این سیستم استفاده میکند. میتوانید با استفاده از برنامه زمانبند وظایف (Task Scheduler) همه وظایف پسزمینه را بررسی کنید. وظایف اضافهشده توسط Git دارای نامهایی به فرم Git Maintenance (<frequency>) هستند. رابط گرافیکی Task Scheduler راههایی برای بازرسی این وظایف دارد، اما میتوانید وظایف را در فایلهای XML خروجی بگیرید و جزئیات را در آنجا مشاهده کنید.
توجه داشته باشید که از آنجا که Git یک برنامه کنسولی است، این وظایف پسزمینه یک پنجره کنسول قابل مشاهده برای کاربر جاری ایجاد میکنند. این مورد را میتوان به صورت دستی با انتخاب گزینه "Run whether user is logged in or not" در Task Scheduler تغییر داد. این تغییر نیاز به وارد کردن رمز عبور دارد، به همین دلیل است که git maintenance start آن را به صورت پیشفرض انتخاب نمیکند.
اگر میخواهید وظایف پسزمینه را سفارشیسازی کنید، لطفاً نام وظایف را تغییر دهید تا فراخوانیهای بعدی git maintenance (start|stop) وظایف سفارشی شما را بازنویسی نکنند.
پیکربندی (CONFIGURATION)
تمام موارد زیر این خط در این بخش به طور گزینشی از مستندات git-config(1) گنجانده شده است. محتوای آن همان چیزی است که در آنجا یافت میشود:
maintenance.auto
maintenance.autoDetach
در صورت عدم تنظیم، مقدار gc.autoDetach به عنوان جایگزین استفاده میشود. در صورتی که هر دو تنظیم نشده باشند، مقدار پیشفرض true است، به این معنی که فرآیند نگهداری جدا خواهد شد.
maintenance.strategy
راهبرد نگهداری را میتوان با تنظیم maintenance.<task>.enabled و maintenance.<task>.schedule بیشتر تنظیم کرد. در صورت تنظیم، این مقادیر بهجای مقادیر پیشفرض ارائهشده توسط maintenance.strategy استفاده میشوند.
راهبردهای ممکن عبارتند از:
این راهبرد بستهبندی مجدد یک جایگزین کامل برای راهبرد gc است و برای مخازن بزرگ پیشنهاد میشود. این راهبرد پیشفرض برای نگهداری دستی است.
maintenance.<task>.enabled
maintenance.<task>.schedule
maintenance.commit-graph.auto
maintenance.loose-objects.auto
maintenance.loose-objects.batchSize
maintenance.incremental-repack.auto
maintenance.geometric-repack.auto
maintenance.geometric-repack.splitFactor
maintenance.reflog-expire.auto
maintenance.rerere-gc.auto
maintenance.worktree-prune.auto
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |