Git 2.41 manba boshqaruv tizimi mavjud

Uch oylik rivojlanishdan so'ng Git 2.41 tarqatilgan manbalarni boshqarish tizimi chiqarildi. Git eng mashhur, ishonchli va yuqori unumli versiyalarni boshqarish tizimlaridan biri bo'lib, tarmoqlanish va birlashtirishga asoslangan moslashuvchan chiziqli bo'lmagan rivojlanish vositalarini taqdim etadi. Tarixning yaxlitligini va retroaktiv o'zgarishlarga chidamliligini ta'minlash uchun har bir topshiriqda butun oldingi tarixning yashirin xeshlanishi qo'llaniladi, shuningdek, ishlab chiquvchilarning raqamli imzolari bilan individual teglar va majburiyatlarni tasdiqlash mumkin.

Oldingi versiya bilan taqqoslaganda, yangi versiya 542 ta ishlab chiquvchi ishtirokida tayyorlangan 95 ta o'zgartirishni o'z ichiga olgan, ulardan 29 tasi birinchi marta ishlab chiqishda ishtirok etgan. Asosiy innovatsiyalar:

  • Omborda havola qilinmagan (filiallar yoki teglar tomonidan havola qilinmagan) erishib bo'lmaydigan ob'ektlar bilan ishlash yaxshilandi. Olib bo'lmaydigan ob'ektlar axlat yig'uvchi tomonidan o'chiriladi, ammo poyga sharoitlarini oldini olish uchun o'chirilishidan oldin ma'lum vaqt omborda qoladi. Olib bo'lmaydigan ob'ektlarning paydo bo'lish davrini kuzatish uchun ularga o'xshash ob'ektlarning o'zgarishi vaqti bilan teglarni biriktirish kerak, bu ularni barcha ob'ektlar umumiy o'zgarish vaqtiga ega bo'lgan bitta paket faylida saqlashga imkon bermaydi. Ilgari, har bir erishib bo'lmaydigan ob'ekt alohida faylda saqlangan, bu hali o'chirish uchun mos bo'lmagan ko'plab yangi kirish mumkin bo'lmagan ob'ektlar mavjud bo'lganda muammolarga olib keldi. Yangi nashrda "kruft paketlari" mexanizmi sukut bo'yicha etib bo'lmaydigan ob'ektlarni qadoqlash uchun ishlatiladi, bu sizga barcha etib bo'lmaydigan ob'ektlarni bitta paket faylida saqlashga imkon beradi va har bir ob'ektni o'zgartirish vaqti to'g'risidagi ma'lumotlar alohida jadvalda saqlanadi, saqlanadi. ".mtimes" kengaytmali va ".idx" kengaytmali indeks fayli yordamida bog'langan faylda.
    Git 2.41 manba boshqaruv tizimi mavjud
  • Paket fayllari uchun diskda teskari indeksni saqlash sukut bo'yicha yoqilgan. Torvalds/linux repozitoriysida sinovdan o'tkazilganda, teskari indeksdan foydalanish resursni ko'p talab qiladigan "git push" operatsiyalarini va "git cat-" yordamida bitta ob'ekt hajmini hisoblash kabi oddiy operatsiyalarni 1.49 marta tezlashtirishga imkon berdi. fayl —batch='%(objectsize:disk)' "77 marta. Teskari indeksli fayllar (“.rev”) “.git/objects/pack” katalogidagi ombor ichida saqlanadi.

    Eslatib o'tamiz, Git barcha ma'lumotlarni alohida fayllarda joylashgan ob'ektlar ko'rinishida saqlaydi. Repozitariy bilan ishlash samaradorligini oshirish uchun ob'ektlar qo'shimcha ravishda paketli fayllarga joylashtiriladi, ularda ma'lumotlar bir-biridan keyingi ob'ektlar oqimi ko'rinishida taqdim etiladi (shunga o'xshash format git fetch va git push yordamida ob'ektlarni uzatishda qo'llaniladi. buyruqlar). Har bir to'plam fayli uchun indeks fayli (.idx) yaratiladi, bu ob'ekt identifikatori yordamida berilgan ob'ekt saqlanadigan paket faylidagi ofsetni juda tez aniqlash imkonini beradi.

    Yangi nashrga kiritilgan teskari indeks ob'ektni paket faylida joylashtirish haqidagi ma'lumotlardan ob'ekt identifikatorini aniqlash jarayonini optimallashtirishga qaratilgan. Ilgari, bunday konvertatsiya paket faylini tahlil qilish paytida tezda amalga oshirildi va faqat xotirada saqlangan, bu o'xshash indekslarni qayta ishlatishga imkon bermadi va har safar indeksni yaratishga majbur qildi. Indeks yaratish operatsiyasi ob'ekt-pozitsiya juftliklari qatorini yaratish va uni joylashuvi bo'yicha saralashdan iborat bo'lib, bu katta paketli fayllar uchun uzoq vaqt talab qilishi mumkin.

    Masalan, to'g'ridan-to'g'ri indeksdan foydalanadigan ob'ektlar tarkibini ko'rsatish operatsiyasi ob'ektlarning o'lchamini ko'rsatish bo'yicha operatsiyadan 62 baravar tezroq bo'lgan, buning uchun pozitsiyadan ob'ektga ma'lumotlar indekslanmagan. Teskari indeksdan foydalangandan so'ng, bu operatsiyalar taxminan bir xil vaqtni olishni boshladi. Teskari indekslar, shuningdek, diskdan tayyor ma'lumotlarni to'g'ridan-to'g'ri uzatish orqali olish va surish buyruqlarini bajarishda ob'ektlarni yuborish operatsiyalarini tezlashtirishga imkon beradi.

    Git 2.41 manba boshqaruv tizimi mavjud

  • Cheklangan kirishga ega bo'lgan omborlarga kirishda hisobga olish ma'lumotlarini uzatish uchun foydalaniladigan "hisob ma'lumotlari yordamchisi" protokoli hisobga olish ma'lumotlarini qayta ishlovchi va autentifikatsiya amalga oshiriladigan xizmat o'rtasida WWW-Authenticate sarlavhalarini o'tkazish uchun qo'shimcha yordamga ega. WWW-Authenticate sarlavhasini qo'llab-quvvatlash foydalanuvchining omborlarga kirishini yanada aniqroq ajratish va so'rovlar uchun mavjud doiralarni chegaralash uchun OAuth doirasi parametrlarini o'tkazish imkonini beradi.
  • For-each-ref buyrug'iga "%(ahead-behind:" formatlash opsiyasi qo'shildi: )", bu sizga boshqa filialga nisbatan ma'lum bir filialda mavjud yoki mavjud bo'lmagan topshiriqlar soni to'g'risida darhol ma'lumot olish imkonini beradi (bir filial boshqasidan qanchalik orqada yoki majburiyat darajasida). Ilgari, bunday ma'lumotlarni olish uchun siz ikkita alohida buyruqni bajarishingiz kerak edi: filialga xos bo'lgan majburiyatlar sonini olish uchun "git rev-list —count main..my-feature" va "git rev-list —count my-feature". ..main” ni bosib, etishmayotgan topshiriqlar sonini oling. Endi bunday hisob-kitoblarni bitta buyruqqa qisqartirish mumkin, bu ishlovchilarni yozishni osonlashtiradi va bajarish vaqtini qisqartiradi. Misol uchun, birlashtirilmagan filiallarni ko'rsatish va ularning asosiy filialning orqasida yoki oldinda ekanligini baholash uchun siz bitta chiziqdan foydalanishingiz mumkin: $ git for-each-ref —no-merged=origin/HEAD \ —format ='%(refname:short) %(oldinda-orqada:origin/HEAD)' \refs/heads/tb/ | ustun -t tb/cruft-extra-tips 2 96 tb/for-each-ref — bundan oldin ishlatilgan skript o'rniga 16 96 tb/roaring-bitmaps 47 3, bu 17 marta sekinroq ishlaydi: $git for-each-ref — format='%(refname:short)' —no-birlashtirilgan=origin/HEAD \ refs/heads/tb | o'qiyotganda ref do ahead="$(git rev-list -count origin/HEAD..$ref)" back="$(git rev-list -count $ref..origin/HEAD)" printf "%s %d %d\n" "$ref" "$oldinda" "$orqada" bajarildi | ustun -t tb/cruft-extra-tips 2 96 tb/har bir-ref-uchun-16 96 tb/roaring-bitmaplar bundan mustasno 47 3
  • "Git fetch" buyrug'iga "-porcelain" opsiyasi qo'shildi, belgilansa, chiqish " formatida hosil bo'ladi. ", kamroq o'qilishi mumkin, ammo skriptlarni tahlil qilish uchun qulayroq.
  • “Fetch.hideRefs” sozlamasi qoʻshildi, bu sizga server tomonidan obʼyektlarning toʻliq toʻplamini yuborganligini tekshirish bosqichida mahalliy ombordagi baʼzi havolalarni yashirish orqali “git fetch” operatsiyalarini tezlashtirish imkonini beradi, bu esa vaqtni tejaydi. chekni faqat ma'lumotlar to'g'ridan-to'g'ri olinadigan serverlar bilan cheklash. Misol uchun, ko'p sonli kuzatilgan tashqi havolalarni o'z ichiga olgan omborlari bo'lgan tizimda test o'tkazishda maqsadli serverga yuborilganlardan tashqari barcha havolalar bundan mustasno $remote git fetch operatsiyasining bajarilishini 20 daqiqadan 30 soniyagacha qisqartirdi. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
  • "Git fsck" buyrug'i mavjudlik bitmaplari va teskari indekslardagi buzilishlar, nazorat summasi muvofiqligi va qiymatlarning to'g'riligini tekshirish imkoniyatini beradi.
  • Endi "git clone --local" buyrug'i $GIT_DIR ichidagi simvolli havolalarni o'z ichiga olgan ombordan nusxa ko'chirishga urinayotganda xatolikni ko'rsatadi.

Manba: opennet.ru

a Izoh qo'shish