Berapa batas file dalam Git (jumlah dan ukuran)?

175

Adakah yang tahu berapa batasan Git untuk jumlah file dan ukuran file?

Alexandre Rademaker
sumber
Pada Windows, ukuran file maksimum adalah 4 GB (per Juli 2020), karena bug: github.com/git-for-windows/git/issues/1063
cowlinator

Jawaban:

161

Pesan dari Linus ini sendiri dapat membantu Anda dengan beberapa batasan lain

[...] CVS, yaitu akhirnya benar-benar berorientasi pada model "satu file pada satu waktu".

Yang bagus karena Anda dapat memiliki sejuta file, dan kemudian hanya memeriksa beberapa di antaranya - Anda bahkan tidak akan pernah melihat dampak dari 999.995 file lainnya.

Git pada dasarnya tidak pernah benar-benar melihat kurang dari keseluruhan repo. Bahkan jika Anda membatasi hal-hal sedikit (yaitu memeriksa hanya sebagian, atau memiliki sejarah kembali hanya sedikit), git akhirnya masih selalu peduli tentang semuanya, dan membawa pengetahuan sekitar.

Jadi skala git benar-benar buruk jika Anda memaksanya untuk melihat semuanya sebagai satu repositori besar . Saya tidak berpikir bagian itu benar-benar dapat diperbaiki, meskipun kami mungkin dapat memperbaikinya.

Dan ya, maka ada masalah "file besar". Saya benar-benar tidak tahu harus bagaimana dengan file-file besar. Kami mengisap mereka, saya tahu.

Lihat lebih banyak di jawaban saya yang lain : batas dengan Git adalah bahwa setiap repositori harus mewakili " set file yang koheren ", "semua sistem" itu sendiri (Anda tidak dapat menandai "bagian dari repositori").
Jika sistem Anda terbuat dari bagian yang otonom (tetapi saling tergantung), Anda harus menggunakan submodul .

Seperti yang diilustrasikan oleh jawaban Talljoe , batasnya dapat berupa sistem satu (sejumlah besar file), tetapi jika Anda memahami sifat Git (tentang koherensi data yang diwakili oleh kunci SHA-1), Anda akan menyadari "batas" yang sebenarnya. adalah penggunaan : yaitu, Anda tidak harus mencoba menyimpan semuanya dalam repositori Git, kecuali Anda siap untuk selalu mendapatkan atau menandai semuanya kembali. Untuk beberapa proyek besar, itu tidak masuk akal.


Untuk melihat lebih dalam pada batas git, lihat " git dengan file besar "
(yang menyebutkan git-lfs : solusi untuk menyimpan file besar di luar git repo. GitHub, April 2015)

Tiga masalah yang membatasi repo git:

  • file besar ( xdelta untuk packfile hanya ada di memori, yang tidak bagus untuk file besar)
  • sejumlah besar file , yang berarti, satu file per gumpalan, dan memperlambat git gc untuk menghasilkan satu paket sekaligus.
  • file pack besar , dengan indeks packfile tidak efisien untuk mengambil data dari file packfile (besar).

Utas yang lebih baru (Februari 2015) menggambarkan faktor pembatas untuk repo Git :

Apakah beberapa klon simultan dari server pusat juga memperlambat operasi konkuren lainnya untuk pengguna lain?

Tidak ada kunci di server saat kloning, jadi dalam teori kloning tidak mempengaruhi operasi lain. Kloning dapat menggunakan banyak memori (dan banyak cpu kecuali Anda mengaktifkan fitur bitmap reachability, yang seharusnya Anda lakukan).

Akankah git pulllambat?

Jika kami mengecualikan sisi server, ukuran pohon Anda adalah faktor utama , tetapi file 25k Anda seharusnya baik-baik saja (linux memiliki file 48k).

' git push'

Yang ini tidak terpengaruh oleh seberapa dalam sejarah repo Anda, atau seberapa lebar pohon Anda, jadi harus cepat ..

Ah jumlah referensi dapat mempengaruhi keduanya git-pushdan git-pull.
Saya pikir Stefan tahu lebih baik daripada saya di daerah ini.

' git commit' (Terdaftar lambat dalam referensi 3. ) ' git status'? (Lambat lagi dalam referensi 3 meskipun saya tidak melihatnya.)
(Juga git-add)

Sekali lagi, ukuran pohon Anda. Pada ukuran repo Anda, saya tidak berpikir Anda perlu khawatir tentang hal itu.

Beberapa operasi mungkin tidak terlihat sehari-hari tetapi jika mereka sering dipanggil oleh web-end ke GitLab / Stash / GitHub dll, maka mereka dapat menjadi hambatan. (misalnya ' git branch --contains' tampaknya sangat dipengaruhi oleh sejumlah besar cabang.)

git-blame bisa lambat ketika file banyak dimodifikasi.

VONC
sumber
4
@ Thr4wn: lihat juga stackoverflow.com/questions/1979167/git-submodule-update/… untuk informasi lebih lanjut di halaman submodule GitPro. Untuk versi yang lebih pendek: stackoverflow.com/questions/2065559/…
VonC
1
Tautan yang diperbarui untuk dokumentasi submit git = git-scm.com/book/en/Git-Tools-Submodules
JHowIX
Saya benar-benar bertanya-tanya, dengan begitu banyak sqlite dan banyak alternatif basis data yang tersedia di linux, mengapa mereka tidak bisa begitu saja menggunakan basis data yang mudah untuk dicadangkan, direplikasi, dan skala.
Akash Kava
"Skala git benar-benar buruk jika Anda memaksanya untuk melihat segala sesuatu sebagai satu repositori besar " apa yang dikatakan tentang skalabilitas monorepos?
ephemer
@ephemer Apa yang dikatakan adalah ... kutipan itu dari 10 tahun yang lalu. Sejak itu, pada 2017, Microsoft memiliki monorepo sendiri ( devblogs.microsoft.com/bharry/… : 300GB +) dan perbaikan masih akan dilakukan pada tahun 2019: stackoverflow.com/a/57129687/6309
VonC
36

Tidak ada batasan nyata - semuanya diberi nama dengan nama 160-bit. Ukuran file harus dapat diwakili dalam angka 64 bit sehingga tidak ada batas nyata di sana.

Namun ada batas praktisnya. Saya memiliki repositori yang ~ 8GB dengan> 880.000 file dan git gc membutuhkan waktu. Pohon yang bekerja agak besar sehingga operasi yang memeriksa seluruh direktori kerja cukup lama. Repo ini hanya digunakan untuk penyimpanan data, jadi hanya sekelompok alat otomatis yang menanganinya. Menarik perubahan dari repo jauh, jauh lebih cepat daripada rsyncing data yang sama.

%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    .
Talljoe
sumber
2
Meskipun ada jawaban "lebih benar" di atas berbicara tentang keterbatasan teoretis, jawaban ini tampaknya lebih bermanfaat bagi saya karena memungkinkan untuk membandingkan situasi sendiri dengan Anda. Terima kasih.
Bananeweizen
1
Sangat menarik. Bagaimana mungkin copy pekerjaan lebih besar dari .gitdirektori? Asumsi naif saya adalah bahwa .gitberisi salinan direktori kerja ditambah sejarah, jadi itu harus lebih besar. Adakah yang bisa mengarahkan saya ke sumber daya yang memahami bagaimana ukuran ini terkait?
bluenote10
1
@ bluenote10 Konten dalam .gitdirektori dikompresi. Jadi repositori dengan komit yang relatif sedikit cenderung memiliki sejarah terkompresi yang lebih kecil daripada direktori kerja yang tidak terkompresi. Pengalaman saya menunjukkan bahwa dalam praktiknya, dengan kode C ++, seluruh riwayat biasanya berukuran sama dengan direktori kerja.
prapin
28

Jika Anda menambahkan file yang terlalu besar (GB dalam kasus saya, Cygwin, XP, 3 GB RAM), harap ini.

fatal: Kehabisan memori, malloc gagal

Lebih detail di sini

Pembaruan 3/2/11: Melihat yang serupa di Windows 7 x64 dengan Tortoise Git. Banyak memori yang digunakan, respons sistem sangat lambat.

Brian Carlton
sumber
17

Kembali pada Februari 2012, ada utas yang sangat menarik di milis Git dari Joshua Redstone, seorang insinyur perangkat lunak Facebook yang menguji Git pada repositori besar:

Repo pengujian memiliki 4 juta komit, riwayat linier dan sekitar 1,3 juta file.

Pengujian yang dijalankan menunjukkan bahwa untuk repo seperti itu Git tidak dapat digunakan (operasi dingin berlangsung beberapa menit), tetapi ini dapat berubah di masa mendatang. Pada dasarnya kinerjanya dihukum oleh jumlah stat()panggilan ke modul FS kernel, sehingga akan tergantung pada jumlah file dalam repo, dan efisiensi caching FS. Lihat juga Intisari ini untuk diskusi lebih lanjut.

CharlesB
sumber
2
+1 Menarik. Itu menggemakan jawaban saya sendiri tentang batasan git yang merinci batasan pada file besar / jumlah file / packfile.
VonC
2

Itu tergantung pada apa maknanya. Ada batas ukuran praktis (jika Anda memiliki banyak file besar, ini bisa sangat lambat). Jika Anda memiliki banyak file, pemindaian juga bisa lambat.

Tidak ada batas yang melekat pada model. Anda tentu bisa menggunakannya dengan buruk dan sengsara.

Dustin
sumber
1

Saya pikir itu baik untuk mencoba menghindari komit file besar sebagai bagian dari repositori (misalnya dump database mungkin lebih baik di tempat lain), tetapi jika seseorang menganggap ukuran kernel dalam repositori, Anda mungkin dapat berharap untuk bekerja dengan nyaman dengan sesuatu yang lebih kecil dalam ukuran dan kurang kompleks dari itu.

Kzqai
sumber
1

Saya memiliki sejumlah besar data yang disimpan dalam repo saya sebagai fragmen JSON individual. Ada sekitar 75.000 file duduk di bawah beberapa direktori dan itu tidak benar-benar merugikan kinerja.

Memeriksa mereka di pertama kalinya, tentu saja, agak lambat.

funwhilelost
sumber
1

Saya menemukan ini mencoba menyimpan sejumlah besar file (350k +) dalam sebuah repo. Ya, simpan. Tertawa.

$ time git add . 
git add . 333.67s user 244.26s system 14% cpu 1:06:48.63 total

Ekstrak berikut dari dokumentasi Bitbucket cukup menarik.

Ketika Anda bekerja dengan repositori repositori DVCS, mendorong, Anda bekerja dengan seluruh repositori dan semua sejarahnya. Dalam praktiknya, setelah repositori Anda menjadi lebih besar dari 500MB, Anda mungkin mulai melihat masalah.

... 94% pelanggan Bitbucket memiliki repositori di bawah 500MB. Baik Kernel Linux dan Android berada di bawah 900MB.

Solusi yang disarankan pada halaman itu adalah untuk membagi proyek Anda menjadi potongan-potongan kecil.

Kasisnu
sumber
Saya kira ini sudah ketinggalan zaman. Saat ini, tampaknya tidak ada apa-apa tentang repo android (atau linux) di situs yang Anda tautkan. Tapi aku bertanya-tanya apakah itu tidak akurat bahkan saat itu? Misalnya bandingkan jawaban ini . Mungkin mereka berarti sesuatu yang lain?
jjj