ขีด จำกัด ของไฟล์ใน Git คืออะไร (จำนวนและขนาด)?


175

ไม่มีใครรู้ว่าขีด จำกัด Git สำหรับจำนวนไฟล์และขนาดของไฟล์คืออะไร?


สำหรับ Windows ขนาดไฟล์สูงสุดคือ 4 GB (ณ เดือนกรกฎาคม 2020) เนื่องจากข้อผิดพลาด: github.com/git-for-windows/git/issues/1063
cowlinator

คำตอบ:


161

ข้อความนี้จากLinus ตัวเองสามารถช่วยคุณได้ด้วยข้อ จำกัด อื่น ๆ

[... ] CVS นั่นคือมันจบลงด้วยการมุ่งเน้นไปที่นางแบบ "หนึ่งไฟล์ต่อครั้ง"

สิ่งใดที่ดีในการที่คุณสามารถมีไฟล์ได้นับล้านไฟล์จากนั้นตรวจสอบเพียงไม่กี่ไฟล์เท่านั้นคุณจะไม่เคยเห็นผลกระทบของไฟล์อื่นอีก 999,995 ไฟล์

Git พื้นฐานไม่เคยดูน้อยกว่า repo ทั้งหมด แม้ว่าคุณจะ จำกัด บางสิ่งบางอย่างเล็กน้อย (เช่นตรวจสอบเพียงบางส่วนหรือมีประวัติย้อนหลังไปเล็กน้อย) แต่คอมไพล์ก็ยังคงใส่ใจทุกสิ่งอยู่ตลอดเวลาและนำความรู้ไปรอบ ๆ

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

และใช่แล้วมีปัญหา "ไฟล์ขนาดใหญ่" ฉันไม่รู้จะทำอย่างไรกับไฟล์ขนาดใหญ่ เราดูดพวกเขาฉันรู้

ดูเพิ่มเติมในคำตอบอื่น ๆของฉัน: ข้อ จำกัด กับ Git คือที่เก็บข้อมูลแต่ละรายการต้องแสดง " ชุดไฟล์ที่เชื่อมโยงกัน ", "ระบบทั้งหมด" ในตัวเอง (คุณไม่สามารถแท็ก "ส่วนหนึ่งของที่เก็บ")
หากระบบของคุณทำด้วยตนเอง ( แต่ระหว่างขึ้นอยู่) ส่วนคุณต้องใช้submodules

ดังที่แสดงโดยคำตอบของ Talljoeขีด จำกัด อาจเป็นระบบหนึ่ง (ไฟล์จำนวนมาก) แต่ถ้าคุณเข้าใจธรรมชาติของ Git (เกี่ยวกับการเชื่อมโยงข้อมูลที่แสดงด้วยปุ่ม SHA-1) คุณจะตระหนักถึง "ขีด จำกัด " ที่แท้จริง คือการใช้งานอย่างหนึ่ง: เช่นคุณไม่ควรพยายามเก็บทุกอย่างในที่เก็บ Git เว้นแต่ว่าคุณพร้อมที่จะรับหรือติดแท็กทุกอย่างกลับมา สำหรับโครงการขนาดใหญ่บางโครงการคงไม่สมเหตุสมผล


สำหรับข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับข้อ จำกัด ของคอมไพล์โปรดดูที่ " git พร้อมไฟล์ขนาดใหญ่ "
(ซึ่งกล่าวถึงgit-lfs : โซลูชันสำหรับจัดเก็บไฟล์ขนาดใหญ่นอก git repo GitHub, เมษายน 2015)

สามประเด็นที่ จำกัด repo คอมไพล์:

  • ไฟล์ขนาดใหญ่ ( xdelta สำหรับ packfileอยู่ในหน่วยความจำเท่านั้นซึ่งไม่ดีสำหรับไฟล์ขนาดใหญ่)
  • ไฟล์จำนวนมากซึ่งหมายถึงหนึ่งไฟล์ต่อหนึ่ง Blob และ git gc ที่ช้าเพื่อสร้างหนึ่งไฟล์ต่อครั้ง
  • huge packfiles ที่มีดัชนี packfile ไม่มีประสิทธิภาพในการดึงข้อมูลจาก (ขนาดใหญ่) packfile

กระทู้ล่าสุด (กุมภาพันธ์ 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 อาจช้าเมื่อแก้ไขไฟล์มาก


4
@ Thr4wn: ดูstackoverflow.com/questions/1979167/git-submodule-update/…สำหรับข้อมูลเพิ่มเติมในหน้า submodule ของ GitPro สำหรับรุ่นที่สั้นกว่า: stackoverflow.com/questions/2065559/…
VonC

1
ลิงก์ที่อัปเดตแล้วสำหรับเอกสารประกอบ git submoules = git-scm.com/book/en/Git-Tools-Submodules
JHowIX

ฉันสงสัยจริงๆว่าด้วย sqlite และทางเลือกฐานข้อมูลจำนวนมากที่มีอยู่บน linux ทำไมพวกเขาไม่สามารถใช้ฐานข้อมูลซึ่งง่ายต่อการสำรองข้อมูลทำซ้ำและขยายขนาด
Akash Kava

"git ปรับขนาดได้ไม่ดีจริง ๆ ถ้าคุณบังคับให้ดูทุกอย่างในที่เก็บขนาดใหญ่ " สิ่งนี้พูดเกี่ยวกับความสามารถในการขยายของ monorepos?
ephemer

@ephemer สิ่งที่ถูกกล่าวคือ ... การอ้างอิงนั้นมาจาก 10 ปีที่แล้ว ตั้งแต่นั้นมาในปี 2560 Microsoft มี monorepo ของตัวเอง ( devblogs.microsoft.com/bharry/ … : 300GB +) และการปรับปรุงยังคงมีอยู่ในปี 2019: stackoverflow.com/a/57129687/6309
VonC

36

ไม่มีการ จำกัด จริง - ทุกอย่างมีชื่อด้วยชื่อ 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    .

2
แม้ว่าจะมีคำตอบที่ "ถูกต้องมากกว่า" ข้างต้นที่พูดถึงข้อ จำกัด ทางทฤษฎีคำตอบนี้ดูเหมือนจะเป็นประโยชน์กับฉันมากขึ้นเนื่องจากช่วยให้สามารถเปรียบเทียบสถานการณ์ของตัวเองกับของคุณได้ ขอบคุณ
Bananeweizen

1
น่าสนใจมาก. เป็นไปได้อย่างไรว่าสำเนาการทำงานมีขนาดใหญ่กว่า.gitไดเรกทอรี สมมติฐานที่ไร้เดียงสาของฉันคือการที่.gitมีสำเนาของไดเรกทอรีการทำงานพร้อมประวัติดังนั้นมันจะต้องมีขนาดใหญ่ ใครช่วยชี้ให้ฉันเข้าใจทรัพยากรว่าขนาดเหล่านี้เกี่ยวข้องกันอย่างไร
bluenote10 10

1
@ bluenote10 เนื้อหาใน.gitไดเรกทอรีถูกบีบอัด ดังนั้นที่เก็บที่มีการคอมมิทค่อนข้างน้อยจึงมีประวัติบีบอัดน้อยกว่าไดเรกทอรีการทำงานที่ไม่บีบอัด ประสบการณ์ของฉันแสดงให้เห็นว่าในทางปฏิบัติด้วยรหัส C ++ โดยทั่วไปแล้วประวัติทั้งหมดจะมีขนาดเท่ากับไดเรกทอรีทำงาน
prapin

28

หากคุณเพิ่มไฟล์ที่มีขนาดใหญ่เกินไป (GB ในกรณีของฉัน Cygwin, XP, 3 GB RAM) ให้คาดหวังสิ่งนี้

ร้ายแรง: หน่วยความจำไม่เพียงพอ malloc ล้มเหลว

รายละเอียดเพิ่มเติมที่นี่

อัปเดต 3/2/11: เห็นคล้ายกันใน Windows 7 x64 ด้วย Tortoise Git หน่วยความจำจำนวนมากใช้การตอบสนองของระบบช้ามาก


17

ย้อนกลับไปในเดือนกุมภาพันธ์ 2012 มีหัวข้อที่น่าสนใจมากในรายชื่อผู้รับจดหมาย Gitจาก Joshua Redstone วิศวกรซอฟต์แวร์ Facebook ที่กำลังทดสอบ Git ในที่เก็บการทดสอบขนาดใหญ่:

ธุรกรรมซื้อคืนมีจำนวน 4 ล้านสัญญาประวัติเชิงเส้นและไฟล์ประมาณ 1.3 ล้านไฟล์

การทดสอบที่ถูกเรียกใช้แสดงว่าสำหรับ repo Git นั้นใช้ไม่ได้ (การดำเนินการที่เย็นเป็นเวลานานนาที) แต่สิ่งนี้อาจเปลี่ยนแปลงได้ในอนาคต โดยทั่วไปประสิทธิภาพถูกลงโทษโดยจำนวนการstat()เรียกไปยังโมดูล FS เคอร์เนลดังนั้นมันจะขึ้นอยู่กับจำนวนไฟล์ใน repo และประสิทธิภาพการแคช FS ดูกระทู้นี้สำหรับการอภิปรายเพิ่มเติม


2
+1 น่าสนใจ นั่นสะท้อนถึงคำตอบของฉันเองเกี่ยวกับข้อ จำกัด ของคอมไพล์ที่แสดงรายละเอียดข้อ จำกัด ของไฟล์จำนวนมาก / จำนวนไฟล์ / ไฟล์แพ็ค
VonC


2

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

แม้ว่าจะไม่ได้มีข้อ จำกัด ที่แท้จริงสำหรับโมเดล คุณสามารถใช้งานได้ไม่ดีและน่าสังเวชอย่างแน่นอน


1

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


1

ฉันมีข้อมูลจำนวนมากที่เก็บอยู่ใน repo ของฉันเป็นชิ้นส่วน JSON แต่ละรายการ มีไฟล์ประมาณ 75,000 ไฟล์ที่อยู่ภายใต้ไดเรกทอรีบางแห่งและไม่เป็นอันตรายต่อประสิทธิภาพการทำงาน

การตรวจสอบพวกเขาในครั้งแรกนั้นช้าไปหน่อย


1

ฉันพบสิ่งนี้พยายามเก็บไฟล์จำนวนมาก (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

ทางออกที่แนะนำในหน้านั้นคือการแบ่งโครงการของคุณออกเป็นกลุ่มย่อย ๆ


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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.