Cara mengecilkan folder .git

134

Basis saya saat ini memiliki ukuran total sekitar. 200MB.

Tapi folder .git saya memiliki ukuran luar biasa 5GB (!). Karena saya mendorong pekerjaan saya ke server eksternal, saya tidak memerlukan riwayat lokal yang besar ...

Bagaimana saya bisa mengecilkan folder .git untuk membebaskan sebagian ruang pada notebook saya? Bisakah saya menghapus semua perubahan yang lebih lama, dari 30 hari?

terima kasih banyak atas bantuannya :)

JMW
sumber
2
Bisakah Anda memposting output git count-objects -v?
CB Bailey
2
Kemungkinan rangkap dari ukuran repositori Reduce git
sds

Jawaban:

113

Anda seharusnya tidak menghapus semua perubahan yang lebih lama dari 30 hari (saya pikir itu entah bagaimana mungkin mengeksploitasi git, tetapi benar-benar tidak direkomendasikan)

Anda bisa menelepon git gc --aggressive --prune, yang akan melakukan pengumpulan sampah di repositori Anda dan memangkas objek lama. apakah Anda memiliki banyak file biner (arsip, gambar, file executable) yang sering berubah? itu biasanya mengarah ke folder .git yang sangat besar (ingat, git menyimpan snapshot untuk setiap revisi dan file biner terkompresi dengan buruk)

rajutan
sumber
32
Sebenarnya, git gc --aggressivedianggap praktik yang buruk. Lebih baik digunakan git repack -a -d --depth=250 --window=250.
Artefact2
18
@ Knittl: tentu saja. Ini pesan dari Linus sendiri: gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Artefact2
3
@ artefact2: terima kasih untuk tautannya! Saya telah membacanya, dan linus menunjukkan, bahwa - agresif tidak akan menggunakan kembali delta (baik) - yang sepertinya tidak ada dalam pertanyaan ini, karena repositori sangat besar. cara repack sebenarnya akan memakan waktu lebih lama. git gc --aggressivepanggilan dikemas ulang dengan ukuran jendela 250 (lih. halaman manual) dan kedalaman 250 (lih. kode sumber). --aggressive juga menambahkan -fsaklar, untuk membuang dan mengulang semua operasi delta sebelumnya (seperti juga disebutkan dalam tautan)
knittl
1
Saya baru saja memeriksa repo hg.nginx.org/nginx (RELEASE-1.4.0 is tip) menggunakan git-remote-hg dan ini menghasilkan repo sekitar 100MB. Menggunakan git gc --aggressive --pruneini membawa ke 19MB.
Lekensteyn
15
@ Artefact2 Pernyataan Anda sudah kedaluwarsa : Catat berapa usia posting itu. Faktanya, pada hari yang sama ketika diposting, diskusi di milis menghasilkan komit ini: [..] Jadi parameter pengepakan sama hari ini untuk kedua metode tersebut. . --prunejuga tidak perlu karena menjadi default sejak v1.5.5-rc0(komit 25ee973 , Maret 2008).
Lekensteyn
68

Inilah yang dikatakan pencipta git Linus tentang cara mengecilkan git repo Anda:

Setara dengan "git gc --aggressive" - ​​tetapi dilakukan * dengan benar * - adalah melakukan sesuatu (semalam) seperti

   git repack -a -d --depth=250 --window=250

di mana hal kedalaman itu hanya tentang seberapa dalam rantai delta dapat (membuat mereka lebih lama untuk sejarah lama - itu sepadan dengan ruang overhead), dan hal jendela adalah tentang seberapa besar jendela objek yang kita inginkan setiap kandidat delta untuk memindai.

Dan di sini, Anda mungkin ingin menambahkan bendera "-f" (yang merupakan "jatuhkan semua delta lama", karena Anda sekarang benar-benar berusaha memastikan bahwa yang ini benar-benar menemukan kandidat yang baik.

sumber: http://gcc.gnu.org/ml/gcc/2007-12/msg00165.html

Apakah ini akan menghilangkan data biner yang menjadi yatim di repo saya? "git repack" tidak akan menghapus gambar atau data biner yang telah Anda periksa di repo Anda dan kemudian menghapusnya. Untuk menghapus data semacam itu secara permanen dari repo Anda, Anda harus menulis ulang riwayat Anda. Contoh umum dari hal itu adalah ketika Anda secara tidak sengaja memeriksa kata sandi Anda di git. Anda dapat kembali dan menghapus beberapa file tetapi kemudian Anda harus menulis ulang riwayat Anda dari saat itu hingga sekarang dan kemudian memaksakan dorongan lalu repo baru ke tempat asal Anda.

David Dehghan
sumber
Bagi saya, folder .git sekitar 1.5G. Saya mencoba ini, tetapi saya mendapat kesalahan followng. fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
Miron
2
Setelah mengeksekusi repacksecara lokal, melakukan commit dan push, apakah psikiater akan dibuat menjadi remote juga?
Timo
@ David Dehghan: Hai, saya mencoba ini dari direktori proyek tetapi ukuran folder .git tidak berubah. Apakah ini yang diharapkan, atau saya perlu mendorong untuk melihat perubahan? (maaf tidak terlalu berpengalaman dengan git.) Saya memiliki gambar / gif dalam repo dan saya melakukan beberapa kali versi yang berbeda dari gambar itu dan saya kira itu meningkatkan ukuran .git.
giorgim
Hai, sayangnya itu sekarang bagaimana Anda membersihkan versi biner lama. Untuk melakukan itu, Anda perlu menulis ulang sejarah Anda yang sebenarnya rumit. Berikut ini beberapa petunjuk untuk Anda: docs.microsoft.com/en-us/azure/devops/articles/…
David Dehghan
22

Saya mencoba ini tetapi repositori saya masih sangat besar. Masalahnya adalah saya tidak sengaja memeriksa beberapa file besar yang dihasilkan. Setelah beberapa pencarian saya menemukan tutorial yang bagus yang membuatnya mudah untuk menghapus file besar yang dihasilkan. Tutorial ini memungkinkan saya untuk mengecilkan repositori saya dari 60 MB menjadi <1 MB.

Steve Lorek, Cara Mengecilkan Gudang Git

Chris Hinshaw
sumber
4
Berikut adalah versi yang diarsipkan jika tautan busuk. Jawaban ini sangat membantu repo saya menemukan di mana file exe dan .zip dilakukan yang membengkak ukuran folder .git
doubleDown
9

5GB vs 200MB agak aneh. Coba lari git gc.

Tapi tidak, kecuali jika Anda membagi repositori menjadi modul, Anda tidak bisa mengurangi ukuran .gitdirektori.

Setiap klon git repo adalah repositori lengkap yang dapat bertindak sebagai server. Itulah prinsip dasar kontrol versi terdistribusi.

Šimon Tóth
sumber
3

Saya menggunakan git lebih sebagai mekanisme sinkronisasi daripada untuk riwayat versi. Jadi solusi saya untuk masalah ini adalah memastikan saya memiliki semua sumber saya saat ini dalam keadaan memuaskan, dan kemudian hanya menghapus .git dan menginisialisasi ulang repo. Masalah ruang disk terpecahkan. :-) Riwayat hilang :-( Saya melakukan ini karena repo saya menggunakan kunci USB kecil. Saya tidak ingin atau memerlukan seluruh riwayat saya. Jika saya memiliki metode untuk hanya memotong sejarah, saya akan menggunakannya.

Jika saya tertarik untuk menjaga riwayat saya, saya akan mengarsipkan repositori saat ini. Pada suatu saat nanti saya bisa mengkloning repositori asli, menyalin semua perubahan dari repo baru (mari kita asumsikan saya belum melakukan banyak (ada) mengubah nama atau menghapus). Dan kemudian buat satu komit besar yang akan mewakili semua perubahan yang dibuat dalam repo baru sebagai komit tunggal dalam repo lama. Apakah mungkin untuk menggabungkan sejarah? Mungkin jika saya menggunakan cabang dan kemudian menghapus objek yang tidak saya butuhkan. (Saya tidak cukup tahu tentang git internal untuk mulai bermain-main seperti itu).

Darrel Lee
sumber
1
Anda bisa menggunakan Dropbox sebagai gantinya. Saya lakukan selama bertahun-tahun.
Jonny
0

Mencoba metode di atas, tidak ada yang berhasil dalam kasus saya (di mana saya secara tidak sengaja membunuh proses git selama push git) jadi saya akhirnya harus menghapus repo dan mengkloningnya lagi dan sekarang folder .git berukuran normal.

JerryGoyal
sumber
Saya harus menggunakan solusi yang sama karena disk saya penuh (folder .git> 90 GB) jadi saya bahkan tidak bisa menjalankan repack atau git gc!
Fl4v