git-annex - เครื่องมือจัดการไฟล์ขนาดใหญ่สำหรับผู้ใช้ Git
(git-annex.branchable.com)- git-annex เป็นเครื่องมือที่ช่วยให้ จัดการไฟล์ขนาดใหญ่ได้โดยไม่ต้องเก็บเนื้อหาของไฟล์ไว้ใน Git repository โดยตรง
- รองรับการทำ ซิงก์, สำรองข้อมูล, เก็บถาวร ทั้งในสภาพแวดล้อมออฟไลน์และออนไลน์ พร้อมรับประกันความปลอดภัยด้วย checksum และ การเข้ารหัส
- นำ คุณสมบัติแบบกระจาย ของ Git มาใช้กับไฟล์ขนาดใหญ่ ทำให้การติดตามตำแหน่งและการถ่ายโอนระหว่างไดรฟ์ เซิร์ฟเวอร์ และคลาวด์หลายแห่งเป็นเรื่องง่าย
- เหมาะกับผู้ใช้ที่เน้น CLI และสำหรับผู้ใช้ทั่วไป git-annex assistant ก็ให้ประสบการณ์ใช้งานแบบซิงก์โฟลเดอร์
- เป็นเครื่องมือที่ขยายเวิร์กโฟลว์การเก็บถาวรและการย้ายข้อมูลด้วย รูปแบบ repository ที่เรียบง่าย สำหรับการเก็บระยะยาว และ special remotes ที่หลากหลาย
ภาพรวม
- git-annex เป็นเครื่องมือจัดการไฟล์ขนาดใหญ่ที่เก็บ เนื้อหาของไฟล์ไว้นอก Git และใช้ Git จัดการเฉพาะเมทาดาทาและข้อมูลตำแหน่ง
- ผลลัพธ์คือช่วยให้ประวัติ commit ยังคงมีขนาดเบา ขณะเดียวกันก็จัดเก็บและเคลื่อนย้ายไฟล์ไบนารีขนาดใหญ่ได้อย่างยืดหยุ่น
- รับประกันความถูกต้องสมบูรณ์และความลับของข้อมูลด้วย checksum และ รองรับการเข้ารหัส
- รองรับการทำ ซิงก์, สำรองข้อมูล, เก็บถาวร ได้ทั้งแบบออฟไลน์และออนไลน์ และมีความสามารถในการ จัดการจำนวนสำเนา ของไฟล์เดียวกันระหว่างที่เก็บข้อมูลแบบกระจาย รวมถึงการบันทึก log
- แม้จะออกแบบมาให้เหมาะกับผู้ใช้ command line แต่ผู้ใช้ทั่วไปก็สามารถใช้งานได้ง่ายผ่าน git-annex assistant ในรูปแบบการซิงก์โฟลเดอร์
- มีเอกสาร walkthrough สำหรับผู้ใช้ใหม่ เพื่อเรียนรู้การติดตั้งและขั้นตอนพื้นฐานได้อย่างรวดเร็ว
กรณีใช้งาน: Archivist (ผู้ใช้ที่เน้นการเก็บถาวร)
- แม้จะใช้งาน ไดรฟ์เก็บถาวรแบบออฟไลน์ หลายตัว ก็ยังสามารถ เรียกดูและจัดระเบียบไฟล์ทั้งหมดเสมือนเป็นชุดเดียว ได้จาก directory tree เดียว
- แม้เนื้อหาไฟล์จะอยู่ในไดรฟ์ออฟไลน์ ก็ยังสามารถย้ายตำแหน่งและ commit ได้ผ่าน index และ pointer โดย ไม่มีความเสี่ยงที่จะลบข้อมูลจริงโดยไม่ตั้งใจ
- เมื่อจำเป็นต้องใช้ไฟล์บางไฟล์ ระบบสามารถบอกได้ว่าไฟล์นั้น อยู่ในไดรฟ์ใด และทำให้ พร้อมใช้งานได้อย่างง่ายดาย
- แต่ละไดรฟ์จะแชร์ ข้อมูลตำแหน่งซึ่งกันและกัน เพื่อให้เข้าใจสถานะของคลังเก็บทั้งหมด
- ใช้รูปแบบ repository ที่เรียบง่าย จึงช่วยให้ ยังเข้าถึงไฟล์ได้ในระยะยาว แม้จะไม่ได้ใช้ git-annex หรือ Git แล้วก็ตาม
- สามารถใช้ งาน cron เพื่อเก็บถาวรไฟล์ใหม่โดยอัตโนมัติในช่วงกลางคืน และบันทึกทั้งสำเนาที่ตั้งใจสร้างและสำเนาที่เกิดขึ้นโดยไม่ตั้งใจ เพื่อใช้เป็นข้อมูลประกอบการตัดสินใจว่า ควรทำสำเนาเพิ่มเมื่อใด
กรณีใช้งาน: Nomad (ผู้ใช้ที่เน้นการเคลื่อนย้าย)
- จัดการที่เก็บข้อมูลต่างชนิดอย่างโน้ตบุ๊ก, USB drive/ keydrive แบบพกพา, เซิร์ฟเวอร์ระยะไกล และ คลาวด์สตอเรจแบบเข้ารหัส ได้อย่างสม่ำเสมอ เสมือนเป็น Git remotes
- ระหว่างเดินทาง สามารถสะสม คิวดาวน์โหลด ไว้ที่เซิร์ฟเวอร์ก่อน แล้วค่อยถ่ายโอนจริงในสถานที่ที่คุณภาพการเชื่อมต่อดีกว่า รองรับเวิร์กโฟลว์แบบ หน่วงเวลาการถ่ายโอน
- สามารถสร้างเวิร์กโฟลว์ที่เหมาะกับการทำงานแบบออฟไลน์ เช่น คัดลอกฉับพลันจาก USB แล้วใช้งานในเครื่อง เพื่อประหยัดแบตเตอรี่
- หลังใช้งานเสร็จ หากกำหนดว่าจะเก็บหรือจะลบไฟล์ใด ก็สามารถคืนพื้นที่ในเครื่อง และในการซิงก์ครั้งถัดไปจะ ซิงก์การเปลี่ยนแปลงกลับไปยังเซิร์ฟเวอร์
- ใช้ special remotes และ transfer pipelines เพื่อให้การย้ายข้อมูลมีความยืดหยุ่นบน storage backend และสภาพเครือข่ายที่หลากหลาย
ฟีเจอร์หลักและประโยชน์
- รับประกันความถูกต้องสมบูรณ์บนพื้นฐานของ content addressing และ checksum พร้อมรองรับ การจัดเก็บแบบเข้ารหัส เพื่อการเก็บรักษาระยะยาวอย่างปลอดภัย
- ด้วย location tracking ทำให้ทราบได้ชัดเจนว่าแต่ละไฟล์ ถูกเก็บไว้ที่ไหน มีสำเนากี่ชุด และพร้อมใช้งานหรือไม่
- นำโมเดล distributed version control มาใช้กับไฟล์ขนาดใหญ่ เพื่อลดการพึ่งพา storage แบบรวมศูนย์และเพิ่ม ความทนทานต่อการทำงานออฟไลน์
- มี assistant mode ที่มอบประสบการณ์แบบซิงก์โฟลเดอร์ ทำให้ผู้ที่ไม่ชำนาญ CLI ก็ยังใช้งานได้ในระดับ ลากแล้ววาง
สรุปข้อดี
- git-annex จัดการเฉพาะ reference ของไฟล์ใน git จึงเหมาะอย่างยิ่งสำหรับการทำงานกับไฟล์ขนาดใหญ่โดยไม่เป็นภาระ
- ด้วย โครงสร้างแบบกระจาย จึงสามารถย้าย จัดเก็บ ซิงก์/สำรองข้อมูล และจัดการเวอร์ชันของไฟล์ได้อย่างอิสระระหว่างหลายอุปกรณ์และหลายตำแหน่ง
- มี ความเป็นหนึ่งเดียวและการขยายตัวที่ยอดเยี่ยมเป็นพิเศษ สำหรับสถานการณ์ที่ต้องทำงานแบบออฟไลน์ การเก็บรักษาระยะยาว หรือการจัดการข้อมูลแบบยืดหยุ่นข้ามหลายอุปกรณ์และคลาวด์
- เหมาะกับทั้งผู้ใช้สายเก็บถาวรและสายเคลื่อนย้าย รวมถึงผู้ใช้แบบผสม โดยมี การจัดการนโยบายสำเนา และ ความหลากหลายของ backend ที่เป็นประโยชน์ทั้งต่อองค์กรและผู้ใช้รายบุคคล
- เป็นเครื่องมือที่ขยาย ความเป็นระบบกระจายและความพกพาได้ ของ Git ไปสู่ข้อมูลขนาดใหญ่ ช่วยลด ความเสี่ยงในการปฏิบัติงานและภาระงาน ของการเก็บระยะยาวและงานย้ายข้อมูล
1 ความคิดเห็น
ความเห็นบน Hacker News
ฉันใช้ git-annex จัดการข้อมูลในทุกไดรฟ์ มันติดตามโดยอัตโนมัติว่าไฟล์แต่ละไฟล์อยู่ในไดรฟ์ไหน รักษาจำนวนสำเนาให้เพียงพอ และตรวจสอบ checksum ของทุกไฟล์ ทำงานกับไดรฟ์ออฟไลน์ได้ดีไม่มีปัญหา ตอนเริ่มต้น git-annex อาจรู้สึกว่าเข้าใจยากอยู่บ้าง จึงแนะนำให้สร้างรีโพชั่วคราวขึ้นมาหนึ่งอันแล้วลองทำตาม walkthrough เพื่อฝึกใช้งานจริง และ workflow แบบต่าง ๆ ก็น่าอ่านประกอบเช่นกัน
อยากรู้ว่าคุณเก็บข้อมูลไว้มากแค่ไหน ฉันกำลังใช้ git-annex บน ZFS เพื่อจัดการข้อมูลรูปภาพขนาดหลาย TB ที่มีไฟล์ราว 1 แสนถึง 1 ล้านไฟล์ ตอนแรกไม่มีปัญหาอะไร แต่ช่วงหลังเริ่มช้าลงเรื่อย ๆ จนแต่ละคำสั่งใช้เวลา 5–30 นาที เลยไม่แน่ใจว่าเป็นเพราะ ZFS, git-annex หรือดิสก์กันแน่
ฉันเคยคิดจะใช้ git-annex จัดการข้อมูลมานานแล้ว แต่เจอแรงเสียดทานตอนจะลบไฟล์ออกจริง ๆ และเจอปัญหาอีกหลายอย่าง ถ้าคุณมีเวลา อยากรู้ว่าพอจะแชร์วิธีที่คุณใช้งานมันได้ไหม
ในหน้าเว็บไม่ได้ระบุไว้ แต่ git-annex สร้างโดย Joey Hess เขายังเป็นผู้พัฒนา moreutils และ etckeeper ด้วย
มีการพูดคุยเกี่ยวกับฟีเจอร์ใหม่แบบ native ของ Git สำหรับจัดการอ็อบเจ็กต์ขนาดใหญ่ ที่นี่
จุดที่น่าเสียดายของ git-annex คือมันเขียนด้วย Haskell ไม่ได้เกลียดตัวภาษาเองนะ แต่ตกใจกับจำนวน dependency ที่ต้องติดตั้งมากจริง ๆ หลายตัวไม่ได้ใช้ที่อื่นเลย และมักมีปัญหาเวอร์ชันชนกันระหว่างแอปหลายตัว โดยเฉพาะถ้าติดตั้งผ่าน system package manager จะยิ่งลำบาก แค่ติดตั้ง annex กับ pandoc สองตัวก็มีอัปเดตแพ็กเกจ Haskell ต่อวันเป็นสิบ ๆ รายการแล้ว ถ้าใช้ดิสโทรที่ต้อง build จากซอร์สคงเป็นฝันร้าย จริง ๆ ฉันคิดว่าส่วนใหญ่ static link ไปเลยก็น่าจะปลอดภัย แต่ฝั่ง Haskell กลับบอกว่านี่เป็นผลจากการแยกไลบรารีเป็นโมดูลย่อยละเอียดมาก อย่างไรก็ตามก็ยังมีลำดับความสำคัญอื่น เช่น การดูแลระบบ และฉันไม่เคยเจอปัญหาแบบนี้กับ Rust, Go, Zig, C หรือ C++ ไม่ได้มีเจตนาเป็นปฏิปักษ์กับ ecosystem หรือผู้ใช้ Haskell และฉันเองก็อยากเรียนรู้มัน แต่ก็สงสัยว่าทำไมปัญหานี้ถึงมีอยู่ และทางออกคืออะไร
ใน tooling ของ Haskell รองรับ static linking อยู่แล้ว ฉันเป็นคนดูแล Haskell stack ของ Solus และ pandoc พึ่งแค่ libc ส่วนแพ็กเกจ Haskell ทั้งหมดก็ถูกผูกแบบ static ไว้ในไบนารีแล้วกระจายแบบเดียวกับ Rust พูดอีกอย่างคือมันทำได้แน่นอน บน Solus เราใช้ static linking เพราะ dependency เยอะเกินไป ฉันมองว่านี่เป็นเรื่องการตัดสินใจของผู้ดูแลดิสโทร
เรื่อง “ส่วนใหญ่ static link ไปเลยก็น่าจะปลอดภัย” นี่ ถ้าเป็น repo ของดิสโทร สุดท้ายมันไม่ใช่ประเด็นเรื่องนโยบายของ package manager หรอกหรือ
ต่อให้มองจากฝั่งนักพัฒนา Haskell แบบเต็มเวลา ฉันก็มีอาการต่อต้านคล้ายกันกับแพ็กเกจ Haskell ที่ไม่ได้ static link ใน AUR ก็มีเวอร์ชันที่ static link มาแล้ว อย่างน้อยก็แปลว่าไม่ใช่สิ่งที่ทำไม่ได้ แต่ฉันก็ไม่เคยขุดจริงจังว่าทำไมคนทำแพ็กเกจถึงยืนกรานจะใช้ dynamic link โดยทั่วไป dynamic link อาจเหมาะกับการกระจายซอฟต์แวร์ภายในองค์กร แต่ดูเหมือนจะมีการฉายแนวคิดนั้นไปยังดิสโทรโดยไม่จำเป็น
อยากรู้ว่าคุณใช้ package manager อะไร บนระบบสาย apt ฉันไม่เคยเจอปัญหาเพราะ Haskell เลย
ทุกครั้งที่รัน
pacman -Syuอัปเดตครึ่งหนึ่งเป็นแพ็กเกจ Haskell จนน่ารำคาญ น่าจะเพราะ pandoc หรือ shellcheckgit-annex เป็นเทคโนโลยีที่เจ๋งมาก แต่จากความรู้สึกของฉันมันทำงานได้ดีที่สุดกับรีโพแบบผู้ใช้คนเดียว เช่น คนคนหนึ่งใช้มันจัดการข้อมูลส่วนตัวของตัวเอง ไม่ว่าจะเป็นไฟล์ เอกสาร เพลง ข้ามหลายอุปกรณ์ ฉันเคยลองใช้เพื่อซิงก์ในรีโพทำงานร่วมกันที่มีไฟล์ขนาดใหญ่ แต่แนวทาง branch แบบ “magic” มันขยายสเกลได้ไม่ดี
ฉันใช้ forgejo แบบ self-hosted อยู่ ตอนนี้ยังมองไม่เห็นว่าจุดไหนที่ git-annex เหนือกว่า LFS และก็ดูไม่น่าจะตั้งค่าได้ง่ายด้วย ฉันก็ไม่ชอบที่ git-annex เขียนด้วย Haskell และยังไปเจอคำกล่าวว่ามันช้ากว่าประมาณ 50% ด้วย (แม้จะมีแค่แหล่งเดียว เลยยังไม่แน่ใจว่าน่าเชื่อถือไหม) คำสั่งมันคงซับซ้อนด้วยเหตุผลบางอย่าง แต่ก็ไม่ได้มีความสะดวกแบบ LFS ที่แค่ดู
.gitattributesก็รู้แทบทุกอย่าง ฉันก็ไม่รู้สึกว่า git-annex มีความโปร่งใสแบบ.gitattributesเช่นกัน และถ้ายังไม่มีทิวทอเรียลที่บอกคำสั่งเทียบเท่า 'git lfs ls-files' ก็คงยังไม่ค่อยสนใจนัก ปกติฉันมีนิสัยเช็กด้วย 'git status' กับ 'git lfs ls-files'ที่มันช้าไม่ใช่เพราะ Haskell git-annex เป็นเครื่องมือ backup แบบกระจายศูนย์ ความช้ามาจากพฤติกรรมที่หมกมุ่นกับ I/O และการรักษาความคงอยู่ของข้อมูล เช่น เวลาสั่ง drop มันต้องตรวจสอบแบบเรียลไทม์กับทุก remote ว่าคอนเทนต์นั้นยังมีอยู่จริง จึงช้า ถ้าใช้ตัวเลือกอย่าง --fast เพื่อเชื่อเฉพาะเมทาดาทาในเครื่องและข้ามขั้นตอนตรวจสอบไป จะเร็วขึ้นมาก (แต่ก็เสี่ยงขึ้นเล็กน้อย)
LFS กับ git-annex ใช้คนละงานกันแบบละเอียดอ่อน LFS เหมาะกับตัวอย่างงานพัฒนาที่มีไฟล์ขนาดใหญ่ปะปนอยู่ในรีโพ git เช่น การพัฒนาเกม ส่วน git-annex เหมาะกว่าเมื่อใช้เพื่อสำรองข้อมูลสำคัญ หรือเก็บชุดไฟล์ขนาดใหญ่หลายแห่ง เช่น โฟลเดอร์เพลง ฉันใช้มันในแบบหลัง
มี soft-fork ของ Forgejo ที่รองรับ git-annex: forgejo-aneksajo
รีโพที่ใหญ่ที่สุดที่ฉันจัดการด้วย git-annex มีขนาดหลาย TB กระจายอยู่หลายระบบ และหลายไฟล์ก็ใหญ่เกิน 10GB ถ้าสิ่งที่ผู้เขียนต้องการคืออะไรที่เหมือน git-lfs-ls-files ใน git-annex ก็น่าจะเป็น
git annex list --in hereฉันชอบที่เอกสาร command line เอากรณีใช้งานจริงขึ้นมาไว้หน้าสุดเลย แสดงถึงความเป็นแฟนของผู้ใช้เครื่องมือนี้ดี หลายเครื่องมือมักเริ่มจากอธิบายออปชันลึกลับที่แทบไม่มีใครใช้ ทำให้รู้สึกเสียดาย
GitHub ไม่ได้นำ git-annex มาใช้ และใช้แนวทาง NIH (Not Invented Here) แบบฉบับ Microsoft กับ LFS แทน
ฉันเองก็คิดว่า git-annex ดูสง่างามกว่า แต่การรองรับข้ามแพลตฟอร์มอ่อนกว่า อ้างอิงเพิ่มเติมคือ LFS เกิดจากความร่วมมือระหว่าง GitHub กับ Bitbucket (หรือจริง ๆ เป็น forge ตัวไหนสักตัว ฉันจำไม่แม่น) ฝ่ายหนึ่งทำ implementation อีกฝ่ายให้ชื่อ แล้วมารวมกันหลังจากเจอกันในงานประชุม Git สิ่งที่น่าเสียดายที่สุดทุกวันนี้คือข้อจำกัดที่ GitHub ใช้กับโปรเจ็กต์ขนาดใหญ่ และยังมีนโยบายว่า “ต้องดึงอ็อบเจ็กต์ทั้งหมดมาลงเครื่องก่อนจึงจะ push ได้” ทำให้ชุมชนนักพัฒนาขนาดใหญ่ชนเพดานกันเร็วมาก อ้างอิง: ฉันเคยมีส่วนร่วมกับ git-lfs
(พูดตรง ๆ) แนวทาง NIH ของ GitHub เสียเปรียบในทุกมิติ มีคนนำเสนอที่รัก git-annex มาก: Staying in Control of your Scientific Data with Git Annex by Yann Büchau
น่าขันดีที่เมื่อสุดสัปดาห์ที่ผ่านมา ฉันใช้เวลาหนึ่งวันทำระบบ version control สำหรับไฟล์ขนาดใหญ่ของตัวเองขึ้นมา เพราะเกลียด git-annex มาก มันเปลี่ยนไฟล์ให้กลายเป็น blob และทำให้ไฟล์ซิสเต็มบวม เป้าหมายหลักของฉันคือการซิงก์ระหว่างไฟล์แบบกระจายศูนย์ ไม่ได้สนใจเรื่อง version control เลย (จริง ๆ ไม่เข้าใจด้วยซ้ำว่าทำไมไฟล์ขนาดใหญ่ถึงต้องมี version control) ถ้าใช้ AI ช่วยกับ Python ก็ทำเมธอดช่วยสำหรับแฮชไฟล์ สร้าง lookup table และใช้ rclone ซิงก์แหล่งข้อมูลได้ มีวิธีที่ง่ายและมีประสิทธิภาพกว่านี้อีกมาก
ฉันใช้มันมาหลายปี และข้อดีที่ใหญ่ที่สุดคือการเชื่อมกับผู้ให้บริการ cloud storage และระบบ backup แต่ฟีเจอร์การเชื่อมนั้นไม่เสถียรมาโดยตลอด และพึ่งพาปลั๊กอินจากภายนอกที่ไม่ได้รับการดูแล สมัยหนึ่งเคยมีบั๊กข้อมูลไม่สอดคล้องกันด้วย สุดท้ายเลยเลิกใช้ อยากรู้ว่าในช่วง 5 ปีหลังมีอะไรดีขึ้นไหม