มีระบบควบคุมซอร์ส Git 2.41

หลังจากการพัฒนาเป็นเวลาสามเดือน Git 2.41 ระบบควบคุมแหล่งที่มาแบบกระจายก็ได้รับการเผยแพร่แล้ว Git เป็นหนึ่งในระบบควบคุมเวอร์ชันที่ได้รับความนิยม เชื่อถือได้ และมีประสิทธิภาพสูง โดยมอบเครื่องมือการพัฒนาแบบไม่เชิงเส้นที่ยืดหยุ่นตามการแยกสาขาและการรวมเข้าด้วยกัน เพื่อให้มั่นใจถึงความสมบูรณ์ของประวัติและการต่อต้านการเปลี่ยนแปลงย้อนหลัง จึงมีการใช้การแฮชโดยนัยของประวัติก่อนหน้าทั้งหมดในการคอมมิตแต่ละครั้ง นอกจากนี้ยังสามารถรับรองแต่ละแท็กและคอมมิตด้วยลายเซ็นดิจิทัลของนักพัฒนาได้อีกด้วย

เมื่อเทียบกับรุ่นก่อนหน้า เวอร์ชันใหม่มีการเปลี่ยนแปลง 542 รายการ ซึ่งเตรียมโดยการมีส่วนร่วมของนักพัฒนา 95 คน โดย 29 คนมีส่วนร่วมในการพัฒนาเป็นครั้งแรก นวัตกรรมหลัก:

  • ปรับปรุงการจัดการอ็อบเจ็กต์ที่ไม่สามารถเข้าถึงได้ซึ่งไม่ได้อ้างอิงในพื้นที่เก็บข้อมูล (ไม่อ้างอิงโดยสาขาหรือแท็ก) วัตถุที่ไม่สามารถเข้าถึงได้จะถูกลบโดยตัวรวบรวมขยะ แต่ยังคงอยู่ในพื้นที่เก็บข้อมูลเป็นระยะเวลาหนึ่งก่อนที่จะถูกลบเพื่อหลีกเลี่ยงสภาวะการแข่งขัน ในการติดตามระยะเวลาที่เกิดวัตถุที่ไม่สามารถเข้าถึงได้ จำเป็นต้องแนบแท็กเข้ากับแท็กพร้อมกับเวลาของการเปลี่ยนแปลงของวัตถุที่คล้ายกัน ซึ่งไม่อนุญาตให้จัดเก็บไว้ในไฟล์แพ็กเดียวซึ่งวัตถุทั้งหมดมีเวลาการเปลี่ยนแปลงร่วมกัน ก่อนหน้านี้ แต่ละอ็อบเจ็กต์ที่ไม่สามารถเข้าถึงได้จะถูกจัดเก็บไว้ในไฟล์แยกต่างหาก ซึ่งนำไปสู่ปัญหาเมื่อมีออบเจ็กต์ใหม่ที่ไม่สามารถเข้าถึงได้จำนวนมากที่ยังไม่มีสิทธิ์ถูกลบ ในรีลีสใหม่ กลไก "cruft packs" ถูกใช้เป็นค่าเริ่มต้นสำหรับการบรรจุวัตถุที่ไม่สามารถเข้าถึงได้ ซึ่งช่วยให้คุณสามารถจัดเก็บวัตถุที่ไม่สามารถเข้าถึงได้ทั้งหมดไว้ในไฟล์แพ็คเดียว และข้อมูลเกี่ยวกับเวลาแก้ไขของแต่ละวัตถุจะแสดงในตารางแยกต่างหากที่เก็บไว้ ในไฟล์ที่มีนามสกุล “.mtimes” และเชื่อมโยงโดยใช้ไฟล์ดัชนีที่มีนามสกุล “.idx”
    มีระบบควบคุมซอร์ส Git 2.41
  • การรักษาดัชนีย้อนกลับบนดิสก์สำหรับไฟล์แพ็คจะถูกเปิดใช้งานตามค่าเริ่มต้น เมื่อทำการทดสอบบนที่เก็บ torvalds/linux การใช้ดัชนีย้อนกลับทำให้สามารถเร่งความเร็วการดำเนินการ “git push” ที่ใช้ทรัพยากรจำนวนมากได้ 1.49 เท่า และการดำเนินการง่ายๆ เช่น การคำนวณขนาดของวัตถุเดี่ยวโดยใช้ “git cat- ไฟล์ —batch='%(objectsize:disk)' "77 ครั้ง ไฟล์ (“.rev”) ที่มีดัชนีย้อนกลับจะถูกจัดเก็บไว้ในพื้นที่เก็บข้อมูลในไดเร็กทอรี “.git/objects/pack”

    จำได้ว่า Git เก็บข้อมูลทั้งหมดในรูปแบบของวัตถุซึ่งอยู่ในไฟล์แยกกัน เพื่อเพิ่มประสิทธิภาพในการทำงานกับพื้นที่เก็บข้อมูล ออบเจ็กต์จะถูกวางเพิ่มเติมในไฟล์แพ็ค ซึ่งข้อมูลจะถูกนำเสนอในรูปแบบของสตรีมของออบเจ็กต์ที่ติดตามกัน (รูปแบบที่คล้ายกันนี้ใช้สำหรับการถ่ายโอนอ็อบเจ็กต์ด้วยการดึงข้อมูล git และ git push คำสั่ง) สำหรับไฟล์แพ็คแต่ละไฟล์ ไฟล์ดัชนี (.idx) จะถูกสร้างขึ้น ซึ่งช่วยให้คุณกำหนดออฟเซ็ตในไฟล์แพ็คที่เก็บอ็อบเจ็กต์ที่กำหนดได้อย่างรวดเร็วโดยใช้ตัวระบุอ็อบเจ็กต์

    ดัชนีย้อนกลับที่รวมอยู่ในรีลีสใหม่มีวัตถุประสงค์เพื่อปรับกระบวนการกำหนดตัวระบุออบเจ็กต์จากข้อมูลเกี่ยวกับตำแหน่งของออบเจ็กต์ในไฟล์แพ็คให้เหมาะสม ก่อนหน้านี้ การแปลงดังกล่าวดำเนินการทันทีขณะแยกวิเคราะห์ไฟล์แพ็คและถูกจัดเก็บไว้ในหน่วยความจำเท่านั้น ซึ่งไม่อนุญาตให้ใช้ดัชนีที่คล้ายกันซ้ำ และบังคับให้สร้างดัชนีในแต่ละครั้ง การดำเนินการสร้างดัชนีเริ่มต้นที่การสร้างอาร์เรย์ของคู่ตำแหน่งของวัตถุและจัดเรียงตามตำแหน่ง ซึ่งอาจใช้เวลานานสำหรับไฟล์แพ็คขนาดใหญ่

    ตัวอย่างเช่น การดำเนินการเพื่อแสดงเนื้อหาของออบเจ็กต์ซึ่งใช้ดัชนีโดยตรงจะเร็วกว่าการดำเนินการเพื่อแสดงขนาดของออบเจ็กต์ถึง 62 เท่า ซึ่งข้อมูลตำแหน่งต่อออบเจ็กต์ไม่ได้รับการจัดทำดัชนี หลังจากใช้ดัชนีย้อนกลับ การดำเนินการเหล่านี้เริ่มใช้เวลาประมาณเดียวกัน ดัชนีย้อนกลับยังช่วยให้คุณเร่งความเร็วการดำเนินการส่งอ็อบเจ็กต์เมื่อดำเนินการคำสั่งดึงข้อมูลและพุชโดยการถ่ายโอนข้อมูลสำเร็จรูปจากดิสก์โดยตรง

    มีระบบควบคุมซอร์ส Git 2.41

  • โปรโตคอล “ตัวช่วยข้อมูลรับรอง” ที่ใช้ในการถ่ายโอนข้อมูลรับรองเมื่อเข้าถึงที่เก็บข้อมูลที่มีการเข้าถึงที่จำกัด ได้เพิ่มการรองรับสำหรับการส่งส่วนหัว WWW-Authenticate ระหว่างตัวจัดการข้อมูลรับรองและบริการที่ทำการตรวจสอบสิทธิ์ การสนับสนุนส่วนหัว WWW-Authenticate ช่วยให้คุณสามารถส่งพารามิเตอร์ขอบเขต OAuth เพื่อการแยกการเข้าถึงพื้นที่เก็บข้อมูลของผู้ใช้ที่ละเอียดยิ่งขึ้น และการกำหนดขอบเขตขอบเขตที่พร้อมใช้งานสำหรับคำขอ
  • เพิ่มตัวเลือกการจัดรูปแบบ "%(ahead-behind:" ให้กับคำสั่ง for-each-ref: )” ซึ่งช่วยให้คุณได้รับข้อมูลเกี่ยวกับจำนวนการคอมมิตที่มีอยู่หรือขาดหายไปในสาขาใดสาขาหนึ่งโดยสัมพันธ์กับสาขาอื่น (จำนวนสาขาหนึ่งที่ตามหลังหรือนำหน้าอีกสาขาในระดับคอมมิต) ก่อนหน้านี้ หากต้องการรับข้อมูลดังกล่าว คุณต้องเรียกใช้คำสั่งแยกกันสองคำสั่ง: “git rev-list —count main..my-feature” เพื่อรับจำนวนการคอมมิตเฉพาะสำหรับสาขาและ “git rev-list —count my-feature ..main” เพื่อรับจำนวนการคอมมิตที่หายไป ตอนนี้การคำนวณดังกล่าวสามารถลดลงเหลือเพียงคำสั่งเดียว ซึ่งช่วยให้การเขียนตัวจัดการง่ายขึ้นและลดเวลาดำเนินการ ตัวอย่างเช่น หากต้องการแสดงสาขาที่ยังไม่ได้รวมเข้าด้วยกันและประเมินว่าสาขาอยู่หลังหรือนำหน้าสาขาหลัก คุณสามารถใช้บรรทัดเดียว: $ git for-each-ref —no-merged=origin/HEAD \ —format ='%(refname:short) %(ข้างหน้า-ข้างหลัง :origin/HEAD)' \refs/heads/tb/ | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref—ไม่รวม 16 96 tb/roaring-bitmaps 47 3 แทนที่จะเป็นสคริปต์ที่ใช้ก่อนหน้านี้ ซึ่งทำงานช้าลง 17 เท่า: $ git for-each-ref — format='%(refname:short)' —no-merged=origin/HEAD \ refs/heads/tb | ในขณะที่อ่าน ref ทำข้างหน้า = "$(git rev-list -count origin/HEAD..$ref)" behind="$(git rev-list -count $ref..origin/HEAD)" printf "%s %d %d\n" "$ref" "$ahead" "$behind" เสร็จแล้ว | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref—ไม่รวม 16 96 tb/roaring-bitmaps 47 3
  • เพิ่มตัวเลือก "-porcelain" ลงในคำสั่ง "git fetch" แล้ว เมื่อระบุ ผลลัพธ์จะถูกสร้างขึ้นในรูปแบบ " " อ่านได้น้อยกว่า แต่สะดวกกว่าสำหรับการแยกวิเคราะห์สคริปต์
  • เพิ่มการตั้งค่า “fetch.hideRefs” ซึ่งช่วยให้คุณเร่งความเร็วการดำเนินการ “git fetch” โดยการซ่อนการอ้างอิงบางส่วนในพื้นที่เก็บข้อมูลในตัวเครื่องในขั้นตอนการตรวจสอบว่าเซิร์ฟเวอร์ได้ส่งชุดวัตถุครบชุด ซึ่งช่วยประหยัดเวลาด้วย จำกัดการตรวจสอบเฉพาะเซิร์ฟเวอร์ที่ดึงข้อมูลโดยตรงเท่านั้น ตัวอย่างเช่น เมื่อรันการทดสอบบนระบบที่มีพื้นที่เก็บข้อมูลที่มีลิงก์ภายนอกที่ถูกติดตามจำนวนมาก การยกเว้นลิงก์ทั้งหมดยกเว้นลิงก์ที่ส่งไปยังเซิร์ฟเวอร์เป้าหมาย $remote จะช่วยลดการดำเนินการของการดำเนินการดึงข้อมูล git จาก 20 นาทีเหลือ 30 วินาที $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ ดึงข้อมูล $remote
  • คำสั่ง "git fsck" ให้ความสามารถในการตรวจสอบความเสียหาย การปฏิบัติตามผลรวมตรวจสอบ และความถูกต้องของค่าในบิตแมปการเข้าถึงและดัชนีย้อนกลับ
  • คำสั่ง "git clone --local" จะแสดงข้อผิดพลาดเมื่อพยายามคัดลอกจากพื้นที่เก็บข้อมูลที่มี symlink ภายใน $GIT_DIR

ที่มา: opennet.ru

เพิ่มความคิดเห็น