- โปรเจกต์ Git เพิ่งเริ่มลงมือแก้ปัญหาการจัดการไฟล์ขนาดใหญ่อย่างเป็นทางการด้วยตัวเอง
- Git LFS เป็นเพียงทางออกชั่วคราวที่สร้างต้นทุนหลายด้านและการผูกติดกับผู้ให้บริการสำหรับผู้ใช้
- ช่วงหลังฟีเจอร์ partial clone ทำให้ Git เพียงอย่างเดียวสามารถทดแทนบทบาทส่วนใหญ่ของ LFS ได้แล้ว
- ต่อจากนี้ โซลูชันใหม่ชื่อ large object promisor ก็กำลังเตรียมถูกรวมเข้าใน Git อย่างเป็นทางการ
- จากการเปลี่ยนแปลงเหล่านี้ แนวโน้มคือคำตอบระยะยาวของการจัดการไฟล์ขนาดใหญ่จะกลับมาจบที่ Git เอง ไม่ใช่ส่วนขยายภายนอก
ปัญหาไฟล์ขนาดใหญ่ของ Git และการเปลี่ยนแปลง
- ถ้าจะบอกว่าศัตรูตัวฉกาจที่สุดของ Git คือ ไฟล์ขนาดใหญ่ ก็คงไม่ผิด
- ไฟล์ขนาดใหญ่ทำให้รีโพซิทอรีของ Git พองตัวขึ้น ทำให้
git clone ช้าลง และส่งผลเสียต่อสภาพแวดล้อมโฮสติ้งส่วนใหญ่ด้วย
การมาของ Git LFS และข้อจำกัด
- ในปี 2015 GitHub เปิดตัว Git LFS เพื่อหลีกเลี่ยงปัญหาไฟล์ขนาดใหญ่
- แต่ตัว Git LFS เองก็เพิ่มความซับซ้อนใหม่และค่าใช้จ่ายด้านสตอเรจเข้าไป
- ชุมชน Git เฝ้าคิดเรื่องการแก้ปัญหารากฐานของไฟล์ขนาดใหญ่มาอย่างเงียบ ๆ และในรีลีสทางการล่าสุดของ Git ก็เริ่มเห็นทิศทางใหม่สำหรับการจัดการไฟล์ขนาดใหญ่โดยไม่ต้องพึ่ง LFS
วิธีที่ทำได้ตั้งแต่วันนี้: แทนที่ Git LFS ด้วย partial clone
-
หลักการของ partial clone
- Git LFS: เก็บไฟล์ขนาดใหญ่ไว้นอกรีโพซิทอรี แล้วดาวน์โหลดเฉพาะไฟล์ที่ต้องใช้มาทำงาน
- Git partial clone (เริ่มใช้ในปี 2017):
- ใช้ออปชัน
--filter เพื่อโคลนโดยตัด blob ที่มีขนาดเกินค่าที่ต้องการออก
- ดาวน์โหลดไฟล์ขนาดใหญ่ที่เกี่ยวข้องจากเซิร์ฟเวอร์เมื่อจำเป็นเท่านั้น
> เมื่อใช้ Partial clone คุณไม่จำเป็นต้องดาวน์โหลด [large binary assets] ล่วงหน้าระหว่าง Clone และ Fetch จึงช่วยลดเวลาในการดาวน์โหลดและการใช้พื้นที่ดิสก์ได้
> - Partial Clone Design Notes, git-scm.com
-
จุดร่วมของ partial clone กับ LFS
- 1. ลดขนาดตอน checkout ให้เล็กที่สุด: รับมาเฉพาะเวอร์ชันล่าสุดและละประวัติไฟล์ทั้งหมด
- 2. โคลนได้เร็ว: เพราะไม่มีการส่งไฟล์ขนาดใหญ่ระหว่าง clone
- 3. ตั้งค่าได้เร็ว: ต่างจาก shallow clone ตรงที่ยังเข้าถึงประวัติทั้งหมดของโปรเจกต์ได้
-
ตัวอย่างการใช้ partial clone
- ตัวอย่างความเร็วในการโคลนและการใช้ดิสก์ของรีโพที่มีประวัติไฟล์ PNG ขนาดใหญ่จำนวนมาก:
- โคลนแบบปกติใช้เวลาเกือบ 4 นาที และกินพื้นที่ 1.3GB
- ถ้าใช้ partial clone และจำกัด blob ที่ 100KB จะโคลนเสร็จใน 6 วินาที และใช้พื้นที่ 49MB
- เทียบกับต้นฉบับแล้ว ความเร็วในการโคลนดีขึ้น 97% และขนาดตอน checkout ลดลง 96%
-
ข้อจำกัดของ partial clone
- หากต้องใช้ข้อมูลที่ถูกกรองออกไป (เช่น
git diff, git blame, git checkout) Git จะร้องขอไฟล์จากเซิร์ฟเวอร์
- นี่เป็นลักษณะเดียวกันกับ Git LFS
- ในการทำงานจริง การไปใช้ blame กับไฟล์ไบนารีเกิดขึ้นไม่บ่อย
ปัญหาของ Git LFS
- การผูกติดกับผู้ให้บริการสูง: อิมพลีเมนเทชันของ GitHub รองรับเฉพาะเซิร์ฟเวอร์ของตัวเอง ทำให้เกิดค่าใช้จ่ายและการผูกติด
- ปัญหาเรื่องต้นทุน: เก็บ 50GB บน GitHub LFS มีค่าใช้จ่าย $40 ต่อปี ขณะที่ Amazon S3 อยู่ที่ $13
- ย้อนกลับได้ยาก: เมื่อย้ายไปใช้ LFS แล้ว จะไม่สามารถกลับคืนสภาพเดิมได้หากไม่ rewrite history
- ต้นทุนการตั้งค่าอย่างต่อเนื่อง: ผู้ร่วมงานทุกคนต้องติดตั้ง LFS หากไม่ติดตั้งจะเห็นเป็นไฟล์เมตาดาต้าแทนไฟล์จริง ซึ่งทำให้สับสน
แนวโน้มในอนาคต: Large Object Promisor
- ไฟล์ขนาดใหญ่สร้างปัญหาเรื่องต้นทุนให้กับแพลตฟอร์มโฮสติ้งอย่าง GitHub และ GitLab เช่นกัน
- Git LFS ช่วยลดต้นทุนเซิร์ฟเวอร์ด้วยการ offload ไฟล์ขนาดใหญ่ไปยัง CDN
-
Large Object Promisor คืออะไร
- เมื่อต้นปีนี้ Git ได้ merge ฟีเจอร์ชื่อ large object promisor เข้ามาอย่างเป็นทางการ
- ฟีเจอร์นี้ช่วยลดภาระสตอเรจฝั่งเซิร์ฟเวอร์คล้ายกับ LFS แต่ลดความซับซ้อนฝั่งผู้ใช้ลงได้มาก
> ความพยายามนี้มีจุดมุ่งหมายเพื่อปรับปรุงงานฝั่งเซิร์ฟเวอร์ โดยเฉพาะงานที่เกี่ยวข้องกับ blob ขนาดใหญ่ซึ่งถูกบีบอัดในรูปแบบไบนารีอยู่แล้ว
> เป็นโซลูชันที่ใช้แทน Git LFS ได้
> – Large Object Promisors, git-scm.com
-
หลักการทำงาน
- 1. ผู้ใช้ push ไฟล์ขนาดใหญ่ไปยัง Git host
- 2. โฮสต์ทำการ offload ไฟล์ขนาดใหญ่ไปยัง promisor backend
- 3. ตอน clone นั้น Git host จะให้ข้อมูล promisor แก่ไคลเอนต์
- 4. ไคลเอนต์จะดึงไฟล์ขนาดใหญ่จาก promisor นั้นโดยอัตโนมัติเมื่อจำเป็น
-
สถานะการนำมาใช้และโจทย์ที่ยังเหลือ
- promisor สำหรับไฟล์ขนาดใหญ่ยังอยู่ระหว่างการพัฒนา และมีบางส่วนของโค้ดถูก merge เข้า Git ในเดือนมีนาคม 2025
- GitLab และที่อื่น ๆ กำลังคุยกันเรื่องการอิมพลีเมนต์เพิ่มเติมและประเด็นที่ยังไม่คลี่คลาย
- กว่าจะมีการใช้งานอย่างแพร่หลายยังต้องใช้เวลาอีกพอสมควร
- ในระยะสั้น การเก็บไฟล์ขนาดใหญ่ยังคงหลีกเลี่ยงการพึ่ง Git LFS ได้ยาก
- หาก promisor ถูกใช้อย่างแพร่หลาย ก็มีแนวโน้มว่า GitHub จะสามารถอัปโหลดไฟล์ที่เกิน 100MB ได้ด้วย
สรุป: อนาคตของไฟล์ขนาดใหญ่ใน Git คือ Git
- โปรเจกต์ Git ยังคงครุ่นคิดเรื่อง ปัญหาไฟล์ขนาดใหญ่ แทนทุกคนอย่างต่อเนื่อง
- ตอนนี้ยังคงจำเป็นต้องใช้ Git LFS อยู่
- แต่เมื่อ partial clone และ large object promisors พัฒนาต่อไป Git LFS จะค่อย ๆ หมดความจำเป็น และอีกไม่นานเราก็น่าจะเข้าสู่ยุคที่จัดการไฟล์ขนาดใหญ่ได้อย่างง่ายดายด้วย Git เพียงอย่างเดียว
- ในอนาคต อุปสรรคสุดท้ายของการใช้งานไฟล์ขนาดใหญ่อาจเหลือแค่การตัดสินใจว่าจะใส่คลัง MP3 ลงใน Git หรือไม่เท่านั้น
ยังไม่มีความคิดเห็น