ไม่มีใครรู้ว่าขีด จำกัด Git สำหรับจำนวนไฟล์และขนาดของไฟล์คืออะไร?
ไม่มีใครรู้ว่าขีด จำกัด Git สำหรับจำนวนไฟล์และขนาดของไฟล์คืออะไร?
คำตอบ:
ข้อความนี้จากLinus ตัวเองสามารถช่วยคุณได้ด้วยข้อ จำกัด อื่น ๆ
[... ] CVS นั่นคือมันจบลงด้วยการมุ่งเน้นไปที่นางแบบ "หนึ่งไฟล์ต่อครั้ง"
สิ่งใดที่ดีในการที่คุณสามารถมีไฟล์ได้นับล้านไฟล์จากนั้นตรวจสอบเพียงไม่กี่ไฟล์เท่านั้นคุณจะไม่เคยเห็นผลกระทบของไฟล์อื่นอีก 999,995 ไฟล์
Git พื้นฐานไม่เคยดูน้อยกว่า repo ทั้งหมด แม้ว่าคุณจะ จำกัด บางสิ่งบางอย่างเล็กน้อย (เช่นตรวจสอบเพียงบางส่วนหรือมีประวัติย้อนหลังไปเล็กน้อย) แต่คอมไพล์ก็ยังคงใส่ใจทุกสิ่งอยู่ตลอดเวลาและนำความรู้ไปรอบ ๆ
ดังนั้นขนาดของคอมไพล์จะแย่มากถ้าคุณบังคับให้ดูทุกอย่างในที่ เก็บขนาดใหญ่ ฉันไม่คิดว่าส่วนนั้นสามารถแก้ไขได้จริง ๆ แม้ว่าเราจะสามารถปรับปรุงได้
และใช่แล้วมีปัญหา "ไฟล์ขนาดใหญ่" ฉันไม่รู้จะทำอย่างไรกับไฟล์ขนาดใหญ่ เราดูดพวกเขาฉันรู้
ดูเพิ่มเติมในคำตอบอื่น ๆของฉัน: ข้อ จำกัด กับ Git คือที่เก็บข้อมูลแต่ละรายการต้องแสดง " ชุดไฟล์ที่เชื่อมโยงกัน ", "ระบบทั้งหมด" ในตัวเอง (คุณไม่สามารถแท็ก "ส่วนหนึ่งของที่เก็บ")
หากระบบของคุณทำด้วยตนเอง ( แต่ระหว่างขึ้นอยู่) ส่วนคุณต้องใช้submodules
ดังที่แสดงโดยคำตอบของ Talljoeขีด จำกัด อาจเป็นระบบหนึ่ง (ไฟล์จำนวนมาก) แต่ถ้าคุณเข้าใจธรรมชาติของ Git (เกี่ยวกับการเชื่อมโยงข้อมูลที่แสดงด้วยปุ่ม SHA-1) คุณจะตระหนักถึง "ขีด จำกัด " ที่แท้จริง คือการใช้งานอย่างหนึ่ง: เช่นคุณไม่ควรพยายามเก็บทุกอย่างในที่เก็บ Git เว้นแต่ว่าคุณพร้อมที่จะรับหรือติดแท็กทุกอย่างกลับมา สำหรับโครงการขนาดใหญ่บางโครงการคงไม่สมเหตุสมผล
สำหรับข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับข้อ จำกัด ของคอมไพล์โปรดดูที่ " git พร้อมไฟล์ขนาดใหญ่ "
(ซึ่งกล่าวถึงgit-lfs : โซลูชันสำหรับจัดเก็บไฟล์ขนาดใหญ่นอก git repo GitHub, เมษายน 2015)
สามประเด็นที่ จำกัด repo คอมไพล์:
กระทู้ล่าสุด (กุมภาพันธ์ 2015) แสดงให้เห็นถึงปัจจัย จำกัด สำหรับ repo Git :
โคลนสองตัวพร้อมกันจากเซิร์ฟเวอร์กลางจะชะลอการดำเนินการพร้อมกันอื่น ๆ สำหรับผู้ใช้รายอื่นหรือไม่
ไม่มีการล็อกในเซิร์ฟเวอร์เมื่อทำการโคลนดังนั้นในการโคลนทฤษฎีจะไม่ส่งผลต่อการดำเนินการอื่น การโคลนสามารถใช้หน่วยความจำได้มากมาย (และ cpu จำนวนมากเว้นแต่คุณจะเปิดใช้งานคุณลักษณะบิตแมปที่สามารถเข้าถึงได้ซึ่งคุณควรทำ)
จะ
git pullช้าไหมถ้าเราแยกฝั่งเซิร์ฟเวอร์ขนาดของทรีของคุณเป็นปัจจัยหลักแต่ไฟล์ 25k ของคุณน่าจะดี (linux มีไฟล์ 48k)
'
git push'อันนี้ไม่ได้รับผลกระทบจากประวัติความเป็นมาของ repo ของคุณหรือว่าต้นไม้ของคุณกว้างแค่ไหนดังนั้นควรรวดเร็ว ..
Ah จำนวน refs อาจส่งผลกระทบต่อทั้งสองและ
git-pushฉันคิดว่าสเตฟานรู้ดีกว่าฉันในเรื่องนี้git-pull'
git commit' (มันอยู่ในรายการช้าในการอ้างอิง 3. ) 'git status'? (ช้าอีกครั้งในการอ้างอิง 3 แม้ว่าฉันจะไม่เห็นก็ตาม)
(เช่นกันgit-add)ขนาดของต้นไม้ของคุณอีกครั้ง ขนาดของ repo ของคุณฉันไม่คิดว่าคุณต้องกังวลกับมัน
การดำเนินการบางอย่างอาจไม่ได้เป็นแบบวันต่อวัน แต่ถ้ามีการเรียกใช้บ่อยๆโดยเว็บฟรอนต์เอนด์ของ GitLab / Stash / GitHub ฯลฯ พวกเขาก็สามารถกลายเป็นคอขวดได้ (เช่น '
git branch --contains' ดูเหมือนว่าจะได้รับผลกระทบอย่างรุนแรงจากสาขาจำนวนมาก)
git-blameอาจช้าเมื่อแก้ไขไฟล์มาก
ไม่มีการ จำกัด จริง - ทุกอย่างมีชื่อด้วยชื่อ 160 บิต ขนาดของไฟล์จะต้องสามารถแทนได้ในจำนวน 64 บิตดังนั้นจึงไม่มีข้อ จำกัด ที่แท้จริง
แม้ว่าจะมีข้อ จำกัด ในทางปฏิบัติ ฉันมีพื้นที่เก็บข้อมูลที่ ~ 8GB พร้อมด้วย> 880,000 ไฟล์และ git gc ใช้เวลาสักครู่ แผนผังการทำงานค่อนข้างใหญ่ดังนั้นการทำงานที่ตรวจสอบไดเร็กตอรี่การทำงานทั้งหมดใช้เวลาพอสมควร. repo นี้ใช้สำหรับการจัดเก็บข้อมูลเท่านั้นดังนั้นจึงเป็นเพียงเครื่องมืออัตโนมัติที่สามารถจัดการได้ การดึงการเปลี่ยนแปลงจาก repo นั้นเร็วกว่าการซิงค์ข้อมูลเดียวกันมาก
%find . -type f | wc -l
791887
%time git add .
git add . 6.48s user 13.53s system 55% cpu 36.121 total
%time git status
# On branch master
nothing to commit (working directory clean)
git status 0.00s user 0.01s system 0% cpu 47.169 total
%du -sh .
29G .
%cd .git
%du -sh .
7.9G .
.gitไดเรกทอรี สมมติฐานที่ไร้เดียงสาของฉันคือการที่.gitมีสำเนาของไดเรกทอรีการทำงานพร้อมประวัติดังนั้นมันจะต้องมีขนาดใหญ่ ใครช่วยชี้ให้ฉันเข้าใจทรัพยากรว่าขนาดเหล่านี้เกี่ยวข้องกันอย่างไร
.gitไดเรกทอรีถูกบีบอัด ดังนั้นที่เก็บที่มีการคอมมิทค่อนข้างน้อยจึงมีประวัติบีบอัดน้อยกว่าไดเรกทอรีการทำงานที่ไม่บีบอัด ประสบการณ์ของฉันแสดงให้เห็นว่าในทางปฏิบัติด้วยรหัส C ++ โดยทั่วไปแล้วประวัติทั้งหมดจะมีขนาดเท่ากับไดเรกทอรีทำงาน
หากคุณเพิ่มไฟล์ที่มีขนาดใหญ่เกินไป (GB ในกรณีของฉัน Cygwin, XP, 3 GB RAM) ให้คาดหวังสิ่งนี้
ร้ายแรง: หน่วยความจำไม่เพียงพอ malloc ล้มเหลว
รายละเอียดเพิ่มเติมที่นี่
อัปเดต 3/2/11: เห็นคล้ายกันใน Windows 7 x64 ด้วย Tortoise Git หน่วยความจำจำนวนมากใช้การตอบสนองของระบบช้ามาก
ย้อนกลับไปในเดือนกุมภาพันธ์ 2012 มีหัวข้อที่น่าสนใจมากในรายชื่อผู้รับจดหมาย Gitจาก Joshua Redstone วิศวกรซอฟต์แวร์ Facebook ที่กำลังทดสอบ Git ในที่เก็บการทดสอบขนาดใหญ่:
ธุรกรรมซื้อคืนมีจำนวน 4 ล้านสัญญาประวัติเชิงเส้นและไฟล์ประมาณ 1.3 ล้านไฟล์
การทดสอบที่ถูกเรียกใช้แสดงว่าสำหรับ repo Git นั้นใช้ไม่ได้ (การดำเนินการที่เย็นเป็นเวลานานนาที) แต่สิ่งนี้อาจเปลี่ยนแปลงได้ในอนาคต โดยทั่วไปประสิทธิภาพถูกลงโทษโดยจำนวนการstat()เรียกไปยังโมดูล FS เคอร์เนลดังนั้นมันจะขึ้นอยู่กับจำนวนไฟล์ใน repo และประสิทธิภาพการแคช FS ดูกระทู้นี้สำหรับการอภิปรายเพิ่มเติม
ตั้งแต่ 2018-04-20 Git สำหรับ Windows มีข้อบกพร่องซึ่ง จำกัด ขนาดไฟล์สูงสุด 4GB ได้อย่างมีประสิทธิภาพโดยใช้การดำเนินการนั้น (ข้อผิดพลาดนี้แพร่กระจายไปยัง lfs เช่นกัน )
ขึ้นอยู่กับความหมายของคุณคืออะไร มีข้อ จำกัด ด้านขนาด (ถ้าคุณมีไฟล์ขนาดใหญ่จำนวนมากมันอาจช้าลงอย่างน่าเบื่อ) หากคุณมีไฟล์จำนวนมากการสแกนอาจช้าลงเช่นกัน
แม้ว่าจะไม่ได้มีข้อ จำกัด ที่แท้จริงสำหรับโมเดล คุณสามารถใช้งานได้ไม่ดีและน่าสังเวชอย่างแน่นอน
ฉันคิดว่ามันเป็นเรื่องดีที่จะพยายามหลีกเลี่ยงไฟล์ขนาดใหญ่ที่เป็นส่วนหนึ่งของพื้นที่เก็บข้อมูล (เช่นดัมพ์ฐานข้อมูลอาจดีกว่าที่อื่น) แต่ถ้าพิจารณาขนาดของเคอร์เนลในที่เก็บคุณอาจคาดหวังว่าจะทำงานได้อย่างสะดวกสบาย ด้วยสิ่งใดก็ตามที่มีขนาดเล็กกว่าและซับซ้อนน้อยกว่านั้น
ฉันมีข้อมูลจำนวนมากที่เก็บอยู่ใน repo ของฉันเป็นชิ้นส่วน JSON แต่ละรายการ มีไฟล์ประมาณ 75,000 ไฟล์ที่อยู่ภายใต้ไดเรกทอรีบางแห่งและไม่เป็นอันตรายต่อประสิทธิภาพการทำงาน
การตรวจสอบพวกเขาในครั้งแรกนั้นช้าไปหน่อย
ฉันพบสิ่งนี้พยายามเก็บไฟล์จำนวนมาก (350k +) ใน repo ใช่เก็บ หัวเราะ
$ time git add .
git add . 333.67s user 244.26s system 14% cpu 1:06:48.63 total
สารสกัดจากเอกสาร Bitbucket ต่อไปนี้ค่อนข้างน่าสนใจ
เมื่อคุณทำงานกับการโคลนที่เก็บ DVCS การผลักคุณกำลังทำงานกับที่เก็บทั้งหมดและประวัติทั้งหมด ในทางปฏิบัติเมื่อพื้นที่เก็บข้อมูลของคุณมีขนาดใหญ่กว่า 500MB คุณอาจเริ่มพบปัญหา
... 94% ของลูกค้า Bitbucket มีพื้นที่เก็บข้อมูลต่ำกว่า 500MB เคอร์เนล Linux และ Android มีขนาดต่ำกว่า 900MB
ทางออกที่แนะนำในหน้านั้นคือการแบ่งโครงการของคุณออกเป็นกลุ่มย่อย ๆ
git มีขีด จำกัด 4G (32 บิต) สำหรับการซื้อคืน