Apakah ada cara untuk mengurangi ukuran folder git?

156

Sepertinya proyek saya semakin besar dan besar dengan setiap git commit/push. Apakah ada cara untuk membersihkan folder git saya?

Sheehan Alam
sumber

Jawaban:

214

Saya tidak yakin apa yang Anda inginkan. Pertama-tama, tentu saja setiap kali Anda melakukan / mendorong direktori akan menjadi sedikit lebih besar, karena harus menyimpan setiap komitmen tambahan tersebut.

Namun, mungkin Anda ingin git gcyang akan "membersihkan file yang tidak perlu dan mengoptimalkan repositori lokal" ( halaman manual ).

Perintah lain yang mungkin relevan adalah git cleanyang akan menghapus file yang tidak terlacak dari pohon Anda ( halaman manual ).

houbysoft
sumber
30
git clean -d -f -x menghapus file yang terdaftar di .gitignore dan semacamnya. Misalnya ruang kerja yang tidak termasuk dalam git, folder Pods, dll.
Kalle
102
WARNINGPerintah seperti yang ditulis di atas oleh @Kalle akan menghapus SETIAP > UNTRACKED <FILE DAN DIRECTORY DALAM GIT ROOT ANDA , bukan hanya "file yang terdaftar di .gitignore". Apa pun yang tidak dilacak oleh Git, terlepas dari apakah itu terdaftar atau tidak .gitignoreakan dihapus. git clean -dfX(perhatikan kasus pada X) hanya akan menghapus item yang memiliki aturan yang berlaku di .gitignore. Harap perhatikan peringatan ini: Jangan pernah menjalankan git cleantanpa menjalankannya dalam mode interaktif, dengan -ialih - alih -f, atau setidaknya melakukan lari kering terlebih dahulu - -ndan kemudian lagi dengan -f.
Adrian Günter
5
Atau membuat cadangan :-)
Mateen Ulhaq
61

Lari:

git remote prune origin

Menghapus semua cabang pelacakan basi yang telah dihapus pada origintetapi masih tersedia secara lokal di remotes/origin.

git gc --auto

' G arbage C ollection' - menjalankan tugas tata graha (mengompresi revisi, menghilangkan benda yang lepas / tidak dapat diakses). The --autobendera pertama menentukan apakah pekerjaan apa pun diperlukan, dan keluar tanpa melakukan apa-apa jika tidak.

phamductri
sumber
4
Beberapa penjelasan tentang apa yang mereka lakukan? Saya tahu bahwa kita dapat Google mereka dan mencari dokumentasi mereka, tetapi itu adalah praktik umum untuk memberikan deskripsi singkat dari jawaban Anda ketika itu melibatkan hanya kode atau perintah.
Dzhuneyt
28

Salah satu skenario di mana git repo Anda akan mendapatkan serius lebih besar dengan setiap komit adalah salah satu di mana Anda melakukan file biner yang Anda hasilkan secara teratur. Penyimpanan mereka tidak akan seefisien file teks .

Lain adalah di mana Anda memiliki sejumlah besar file dalam satu repo (yang merupakan batas git ) alih-alih beberapa subrepo ( dikelola sebagai submodul ).

Dalam artikel ini di ruang git , AlBlue menyebutkan:

Perhatikan bahwa Git (dan Hg, dan DVCS lainnya) memang mengalami masalah di mana (besar) binari diperiksa, kemudian dihapus, karena mereka akan tetap muncul di repositori dan mengambil ruang, bahkan jika mereka tidak saat ini .

Jika Anda memiliki binari besar yang tersimpan di git repo Anda, Anda dapat mempertimbangkan:

Seperti yang saya sebutkan di " Apa batas-batas file dalam Git (jumlah dan ukuran)? ", Yang lebih baru (2015, 5 tahun setelah jawaban ini) Git LFS dari GitHub adalah cara untuk mengelola file-file besar (dengan menyimpan mereka di luar yang Git repositori).

VONC
sumber
1
Dukungan file besar git sangat membantu jika Anda memiliki file biner besar (seperti gambar) yang secara rutin ditambahkan / diperbarui. Lihat git-lfs.github.com . Sangat mudah diimplementasikan, didukung oleh github. Semua anggota tim perlu menginstalnya untuk menggunakannya secara kolaboratif.
Eric Woods
@EricWoods Benar. Saya menyebutkan Git-LFS sebelumnya (64 kali: stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs ). Saya telah mengedit jawaban lama ini sesuai.
VonC
Ha, memang! Lucu bagaimana jawaban berumur 9+ tahun masih relevan (dan sekarang lebih dari itu dengan info LFS).
Eric Woods
22

ya ya, git gc solusinya, tentu saja,

dan secara lokal - Anda bisa menghapus repositori lokal dan mengkloningnya lagi,

tetapi ada sesuatu yang lebih penting di sini ...

detik Anda menunggu git besar & eksternal untuk diproses dikumpulkan ke menit-menit panjang yang dikumpulkan untuk jam waktu tidak efisien yang dihabiskan,

Buat repositori baru (seluruhnya, bukan hanya cabang) dari awal , termasuk satu-satunya versi file terbaru, tentu saja Anda akan kehilangan semua sejarah,

tetapi ketika di dunia kode bukan saatnya untuk menjadi sentimental, tidak ada gunanya menyeret seluruh 5 tahun kode setiap komit atau berbeda, Anda masih bisa menyimpan git & eksternal lama di suatu tempat, jika Anda bernostalgia:]

tetapi, pada titik tertentu Anda benar-benar harus bergerak bersama:]

tim Anda akan berterima kasih!

Komunitas
sumber
12
Sepenuhnya setuju, kami baru-baru ini mengambil pendekatan ini dengan repositori lama dan belum melihat ke belakang; baik, terutama karena kita tidak bisa, tetapi Anda tahu apa yang saya maksud :)
WhatIsHeDoing
13

Menjalankan perintah ini sangat berbahaya, tetapi akan mengecilkan repositori Anda dengan menghapus semua file git recovery / backup Anda:

git reflog expire --expire=now --all && git gc --prune=now --aggressive

Ini akan menghapus semua file yang digunakan git untuk memulihkan repositori Anda dari beberapa perintah buruk, misalnya, jika Anda melakukannya git reset --hard, Anda biasanya dapat memulihkan file yang hilang. Tetapi jika Anda lakukan git reset --hardsebelum git reflog expire...perintah, maka Anda kehilangan segalanya. Sekarang, satu-satunya harapan Anda adalah menggunakan beberapa alat yang menganalisis sistem file Anda dan mencoba memulihkan file yang terhapus, jika tidak diganti.

pengguna
sumber
3
Saya benar-benar tidak akan menyebut ini sangat berbahaya . Saya hanya akan memberi label sesuatu yang Anda harus berhati - hati . Dalam pengalaman saya, sangat sedikit yang pernah menyentuh reflog atau objek yang tidak dapat dijangkau — sebagian besar bahkan tidak tahu mereka ada di sana atau bagaimana berinteraksi dengan mereka, dan karena itu terjebak dalam situasi di mana mereka akan berguna, atau melakukan sesuatu dengan sangat buruk. cara yang tidak efisien. Saya akan mengatakan bahwa jika Anda tidak tahu dan tidak tahu apa yang akan dilakukan perintah-perintah ini, maka Anda dapat menjalankannya dengan aman!
Chris Morgan
10

git clean -d -f -i adalah cara terbaik untuk melakukannya.

Ini akan membantu membersihkan dengan cara yang lebih terkontrol.

-i singkatan dari interaktif.

anandharshan
sumber
3
Meskipun pertanyaan OP tidak jelas, dan ini adalah jawaban yang baik dalam hal itu, saya ingin menunjukkan bahwa git cleanini bukan untuk membersihkan repo, sama halnya dengan membersihkan direktori. Untuk pengguna yang secara buta menyalin / menempel, waspadalah; ini menghapus file / dir yang tidak dilacak yang mungkin Anda inginkan secara lokal.
sraboy
git clean -d -x -f berfungsi dengan baik jika Anda ingin membersihkannya
Rishabh Jain
2

Tidak tahu apakah itu akan menyusut, tetapi setelah saya jalankan git clean, saya sering melakukannya git repack -adjuga, yang mengurangi jumlah file paket.

Damien Sawyer
sumber
5
repack adalah bagian dari git gcproses, jadi tidak perlu menjalankannya secara terpisah
artkoshelev