پس از سه ماه توسعه، انتشار سیستم کنترل منبع توزیع شده Git 2.41 منتشر شد. Git یکی از محبوبترین، قابل اعتمادترین و با کاراییترین سیستمهای کنترل نسخه است که ابزارهای توسعه غیرخطی انعطافپذیری را بر اساس انشعاب و ادغام شاخهها ارائه میکند. برای اطمینان از یکپارچگی تاریخچه و مقاومت در برابر تغییرات ماسبق، از هش ضمنی کل تاریخچه قبلی در هر commit استفاده می شود، همچنین می توان تگ ها و تعهدات فردی را با امضای دیجیتال از توسعه دهندگان تأیید کرد.
در مقایسه با نسخه قبلی، 542 تغییر در نسخه جدید پذیرفته شد که با مشارکت 95 توسعه دهنده تهیه شده بود که 29 نفر از آنها برای اولین بار در توسعه شرکت کردند. نوآوری های اصلی:
- مدیریت بهبود یافته اشیاء غیرقابل دسترس که در مخزن به آنها ارجاع داده نمی شود (شاخه ها یا برچسب ها ارجاع داده نمی شوند). اشیاء غیرقابل دسترس توسط زباله جمع کن حذف می شوند، اما برای جلوگیری از شرایط مسابقه، برای مدت زمان مشخصی قبل از حذف در مخزن باقی می مانند. برای پیگیری دوره اشیاء غیرقابل دسترس، لازم است برچسب هایی را با زمان تغییر اشیاء مشابه به آنها متصل کنید، که اجازه ذخیره آنها در یک بسته-فایل را نمی دهد، که در آن همه اشیا دارای زمان تغییر مشترک هستند. پیش از این، هر شی غیرقابل دسترسی در یک فایل جداگانه ذخیره می شد، که در صورت وجود تعداد زیادی اشیاء غیرقابل دسترسی تازه که هنوز در معرض حذف نبودند، با مشکل مواجه می شد. در نسخه جدید، بهطور پیشفرض، مکانیسم «کرافت بستهها» برای بستهبندی اشیاء غیرقابل دسترسی استفاده میشود، که اجازه میدهد همه اشیاء غیرقابل دسترس را در یک فایل بسته ذخیره کند و دادههای مربوط به زمان اصلاح هر شی را در جدول جداگانهای ذخیرهشده در یک بسته منعکس کند. فایل با پسوند ".mtimes" و با استفاده از یک فایل فهرست با پسوند ".idx" پیوند داده شده است.
- به طور پیشفرض، حفظ فهرست معکوس (revindex) روی دیسک برای فایلهای بسته فعال است. هنگام آزمایش بر روی مخازن torvalds/linux، استفاده از یک نمایه معکوس به ما این امکان را می دهد که عملیات "git push" با منابع فشرده را 1.49 برابر و عملیات ساده، مانند محاسبه اندازه یک شیء واحد با استفاده از "git cat- را سرعت بخشیم. file --batch='%(objectsize:disk)' » 77 بار. فایلهای (.rev") با نمایه معکوس در داخل مخزن در فهرست راهنمای "git/objects/pack" ذخیره میشوند.
به یاد بیاورید که Git تمام داده ها را به صورت اشیاء ذخیره می کند که در فایل های جداگانه قرار می گیرند. برای افزایش کارایی کار با مخزن، اشیا علاوه بر این در فایلهای بسته قرار میگیرند که در آن اطلاعات به شکل جریانی از اشیاء پشت سر هم ارائه میشوند (فرمت مشابهی هنگام انتقال اشیا با git fetch و git استفاده میشود. دستورات فشار). یک فایل فهرست (idx.) برای هر فایل بسته ایجاد می شود، که به شما امکان می دهد خیلی سریع افست موجود در فایل بسته را که توسط آن شی داده شده توسط شناسه شی ذخیره می شود، تعیین کنید.
نمایه معکوس موجود در نسخه جدید با هدف ساده کردن فرآیند تعیین شناسه شی از اطلاعات مربوط به مکان شی در فایل بسته است. پیش از این، چنین تبدیلی در جریان تجزیه فایل بسته انجام می شد و فقط در حافظه ذخیره می شد، که اجازه استفاده مجدد از این شاخص ها را نمی داد و ایندکس را مجبور می کرد هر بار تولید شود. عملیات ساخت ایندکس به ایجاد آرایهای از جفتهای شی-موقعیت و مرتبسازی آن بر اساس موقعیت خلاصه میشود، که میتواند برای فایلهای بسته بزرگ زمان زیادی ببرد.
به عنوان مثال، عملیات نمایش محتویات اشیا که از یک نمایه مستقیم استفاده می کند، 62 برابر سریعتر از عملیات نمایش اندازه اشیاء بود که داده های رابطه موقعیت به شی برای آنها نمایه نشده بود. پس از استفاده از شاخص معکوس، این عملیات تقریباً یکسان طول می کشد. نمایههای معکوس همچنین به شما این امکان را میدهند که با انتقال مستقیم دادههای آماده از دیسک، عملیات ارسال اشیاء را هنگام اجرای دستورات واکشی و فشاری افزایش دهید.
- پشتیبانی برای ارسال هدرهای WWW-Authenticate بین کنترل کننده اعتبار و سرویس احراز هویت به پروتکل "کمک اعتبار" که برای ارسال اعتبارنامه ها هنگام دسترسی به مخازن محدود استفاده می شود، اضافه شده است. پشتیبانی از هدر WWW-Authenticate به شما این امکان را میدهد که پارامترهای دامنه OAuth را به دسترسی کاربر جداگانه به مخازن منتقل کنید و محدودههای موجود برای درخواستها را محدود کنید.
- گزینه فرمت "% (پیش-پشت: )"، که به شما امکان می دهد فوراً اطلاعاتی در مورد تعداد commit های موجود یا غایب در یک شاخه خاص نسبت به شاخه دیگر دریافت کنید (چقدر یک شاخه از دیگری در سطح commit عقب مانده یا جلوتر است). قبلاً، دریافت این اطلاعات به دو دستور جداگانه نیاز داشت: "git rev-list --count main..my-feature" برای دریافت تعداد commit های منحصر به فرد برای یک شاخه و "git rev-list --count my-feature.. main" برای دریافت تعداد commit های گمشده. اکنون چنین محاسباتی را می توان به یک دستور کاهش داد، که کنترل کننده های نوشتن را ساده می کند و زمان اجرا را کاهش می دهد. به عنوان مثال، برای نشان دادن شاخه های ادغام نشده و ارزیابی اینکه آیا آنها پشت یا جلوتر از شاخه اصلی خود هستند، می توانید از یک خط یک خطی استفاده کنید: $ git for-each-ref --no-merged=origin/HEAD \ --format=' %(refname:short) %(Ahead-Behind :origin/HEAD)' \ refs/heads/tb/ | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref-exclude 16 96 tb/roaring-bitmaps 47 3 به جای اسکریپت استفاده شده قبلی، که 17 برابر کندتر است: $ git برای هر ref - format='%(refname:short)' --no-merged=origin/HEAD \ refs/heads/tb | while read ref do ahead="$(git rev-list --count origin/HEAD..$ref)"back="$(git rev-list --count $ref..origin/HEAD)" printf "%s %d %d\n" "$ref" "$ahead" "$behind" انجام شد | ستون -t tb/cruft-extra-tips 2 96 tb/for-her-ref-exclude 16 96 tb/roaring-bitmaps 47 3
- گزینه "--porcelain" به دستور "git fetch" اضافه شده است که خروجی را با فرمت تولید می کند. "، کمتر قابل خواندن، اما راحت تر برای تجزیه در اسکریپت.
- افزودن تنظیمات "fetch.hideRefs" برای سرعت بخشیدن به عملیات "git fetch" با پنهان کردن بخشی از پیوندها در مخزن محلی در مرحله تأیید اینکه سرور مجموعه کاملی از اشیاء را ارسال کرده است، که با محدود کردن بررسی فقط به سرورها در زمان صرفه جویی می کند. که داده ها مستقیماً از آن بازیابی می شوند. به عنوان مثال، هنگام آزمایش بر روی یک سیستم با مخازنی که حاوی تعداد زیادی پیوند خارجی ردیابی شده است، به استثنای همه پیوندها به جز پیوندهایی که به سرور هدف از راه دور $ آدرس داده شده اند، عملیات "git fetch" را از 20 دقیقه به 30 ثانیه کاهش داد. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
- دستور "git fsck" توانایی بررسی خرابی، تطبیق جمع چک و صحت مقادیر در بیت مپ های دسترسی و نمایه های معکوس را پیاده سازی می کند.
- دستور "git clone --local" اکنون هنگام تلاش برای کپی کردن از یک مخزن حاوی پیوندهای نمادین در داخل $GIT_DIR یک خطا نشان می دهد.
منبع: opennet.ru