پس از دو ماه توسعه، Git 2.39، سیستم مدیریت کد منبع توزیعشده، منتشر شد. Git یکی از محبوبترین، قابل اعتمادترین و با کارایی بالا در سیستمهای کنترل نسخه است که قابلیتهای توسعه انعطافپذیر و غیرخطی مبتنی بر شاخهبندی و ادغام را ارائه میدهد. برای اطمینان از یکپارچگی تاریخی و انعطافپذیری در برابر تغییرات گذشتهنگر، از هش ضمنی کل تاریخچه قبلی در هر کامیت استفاده میشود و امضاهای دیجیتالی برچسبها و کامیتهای جداگانه نیز میتوانند مورد استفاده قرار گیرند.
در مقایسه با نسخه قبلی، نسخه جدید شامل ۴۸۳ تغییر است که با مشارکت ۸۶ توسعهدهنده تهیه شده است که ۳۱ نفر از آنها در این پروژه جدید بودهاند. ویژگیهای کلیدی جدید عبارتند از:
- دستور "git shortlog" که آمار خلاصهای از تاریخچه کامیتها را نمایش میدهد، اکنون گزینه "--group" را برای گروهبندی سفارشی کامیتها بر اساس فیلدهایی غیر از نویسنده یا کامیتکننده دارد. برای مثال، برای نمایش لیستی از توسعهدهندگان به همراه اطلاعات مربوط به تعداد تغییرات، از جمله مشارکتکنندگان ذکر شده در فیلد "Co-authored-by"، میتوانید از دستور زیر استفاده کنید: git shortlog -ns --group=author --group=trailer:co-authored-by
خروجی Shortlog را میتوان با استفاده از مشخصکنندههای قالببندی تجمیع کرد و گزینه "--group" ایجاد گزارشهای پیچیده را بدون نیاز به اجرای دستورات مرتبسازی اضافی بسیار آسانتر میکند. برای مثال، برای ایجاد گزارشی که نشان میدهد چه تعداد کامیت برای یک نسخه مشخص در هر ماه پذیرفته شده است، میتوانید مشخص کنید: git shortlog v2.38.0.. --date='format:%Y-%m' --group='%cd' -s 2 2022-08 47 2022-09 405 2022-10 194 2022-11 5 2022-12 پیش از این، یک عملیات مشابه نیاز به استفاده از ابزارهای sort و uniq داشت: git log v2.38.0.. --date='format:%Y-%m' --format='%cd' | sort | uniq -c
- مکانیزم "cruft packs" که برای بستهبندی اشیاء غیرقابل دسترسی که توسط شاخهها یا تگها در مخزن به آنها ارجاع داده نمیشود، طراحی شده است، گسترش یافته است. اشیاء غیرقابل دسترسی، زبالهروب هستند اما قبل از حذف شدن برای جلوگیری از شرایط رقابتی، برای مدت زمان مشخصی در مخزن باقی میمانند. مکانیزم "cruft packs" امکان ذخیره تمام اشیاء غیرقابل دسترسی را در یک فایل بسته واحد و ذخیره زمانهای اصلاح برای هر شیء را در یک جدول جداگانه که در یک فایل جداگانه با پسوند ".mtimes" ذخیره میشود، فراهم میکند تا با زمانهای اصلاح کلی تداخل نداشته باشند.
مدت زمانی که اشیاء غیرقابل دسترسی قبل از حذف واقعی در مخزن باقی میمانند، توسط گزینه "--prune=" تعیین میشود. با این حال، اگرچه تأخیر قبل از حذف، روشی نسبتاً مؤثر و عملی برای جلوگیری از خرابی مخزن به دلیل شرایط رقابتی است، اما ۱۰۰٪ قابل اعتماد نیست. برای سادهسازی بازیابی یک مخزن خراب، نسخه جدید امکان حفظ اشیاء از دست رفته را فراهم میکند. برای این منظور، گزینه "--expire-to" به دستور "git repack" اضافه شده است. این گزینه به شما امکان میدهد فایلی را برای ایجاد یک کپی خارجی از تمام اشیاء حذف شده مشخص کنید. به عنوان مثال، برای ذخیره اشیاء غیرقابل دسترسی که در ۵ دقیقه گذشته تغییر نکردهاند در فایل backup.git، میتوانید از دستور زیر استفاده کنید: git repack --cruft --cruft-expiration=5.minutes.ago -d --expire-to=../backup.git
- عملکرد دستور "git grep --cached" هنگام جستجو در مناطقی که از sparse-checkout استفاده میکنند و دارای شاخصهای جزئی (sparse index) هستند، به طور قابل توجهی (تا 70٪) افزایش یافته است. پیش از این، هنگام تعیین گزینه "--cached"، ابتدا شاخص معمولی جستجو میشد و پس از آن شاخصهای جزئی، که منجر به تأخیرهای قابل توجه هنگام جستجو در مخازن بزرگ میشد.
- سرعت اجرای حکم افزایش یافته است سرور بررسی اتصال اشیاء جدید قبل از قرار دادن آنها در مخزن در طول عملیات git push. با تغییر به در نظر گرفتن فقط لینکهای اعلام شده در طول بررسی، در یک مخزن آزمایشی با ۷ میلیون لینک که تنها ۳٪ از آنها توسط عملیات push پوشش داده شده بودند، این بهینهسازیها زمان بررسی را ۴.۵ برابر کاهش دادند.
- برای محافظت در برابر سرریزهای احتمالی عدد صحیح در کد، دستور "git apply" اکنون حداکثر اندازه پچهای پردازش شده را محدود میکند. هر اندازه پچی که بیش از ۱ گیگابایت باشد، اکنون خطا ایجاد میکند.
- برای محافظت در برابر آسیبپذیریهای احتمالی، تغییراتی ایجاد شده است تا اطلاعات غیرضروری از هدرهای تنظیمشده هنگام استفاده از ماژول h2h3 با گزینه GIT_TRACE_CURL=1 یا GIT_CURL_VERBOSE=1 همراه با HTTP/2 پاک شود.
- هنگام انجام عملیات پرداخت روی شاخهای که یک پیوند نمادین به شاخه دیگری است، دستور git symbolic-ref HEAD اکنون نام شاخه هدف را به جای نام پیوند نمادین چاپ میکند.
- پشتیبانی از آرگومان @{-1} به گزینه "--edit-description" ("git branch --edit-description @{-1}") برای ویرایش توضیحات شاخه قبلی اضافه شد.
- دستور "git merge-tree --stdin" اضافه شد که به شما امکان میدهد لیستی از گزینهها را از طریق جریان ورودی استاندارد ارسال کنید.
- در سیستمهای فایل شبکه، کنترلکنندهی fsmonitor که تغییرات در سیستم فایل را رصد میکند، بهطور پیشفرض غیرفعال است.
منبع: opennet.ru
