Saya punya repo git 300 MB. Ukuran total file yang saya periksa saat ini adalah 2 MB, dan ukuran total dari sisa repo git adalah 298 MB. Ini pada dasarnya adalah repo khusus kode yang tidak boleh lebih dari beberapa MB.
Saya mencurigai seseorang secara tidak sengaja melakukan beberapa file besar (video, gambar, dll), dan kemudian menghapusnya ... tetapi tidak dari git, jadi sejarahnya masih berisi file besar yang tidak berguna. Bagaimana menemukan file besar dalam sejarah git? Ada 400+ komitmen, jadi satu per satu tidaklah praktis.
CATATAN : pertanyaan saya bukan tentang cara menghapus file , tetapi bagaimana menemukannya di tempat pertama.
Jawaban:
Saya menemukan skrip ini sangat berguna di masa lalu untuk menemukan objek besar (dan tidak jelas) di repositori git:
Itu akan memberi Anda nama objek (SHA1sum) gumpalan, dan kemudian Anda bisa menggunakan skrip seperti ini:
... untuk menemukan komit yang menunjuk ke masing-masing gumpalan itu.
sumber
🚀 Shell satu-liner yang sangat cepat 🚀
Skrip shell ini menampilkan semua objek gumpalan di repositori, diurutkan dari yang terkecil hingga yang terbesar.
Untuk repo sampel saya, ini berjalan sekitar 100 kali lebih cepat daripada yang lain yang ditemukan di sini.
Pada sistem Athlon II X4 saya yang tepercaya, ia menangani repositori Kernel Linux dengan 5,6 juta objek hanya dalam satu menit .
Skrip Dasar
Ketika Anda menjalankan kode di atas, Anda akan mendapatkan output yang dapat dibaca manusia seperti ini:
pengguna macOS : Karena
numfmt
tidak tersedia di macOS, Anda bisa menghilangkan baris terakhir dan berurusan dengan ukuran byte mentah ataubrew install coreutils
.Penyaringan
Untuk mencapai pemfilteran lebih lanjut , masukkan baris berikut sebelum
sort
baris .Untuk mengecualikan file yang ada di
HEAD
, masukkan baris berikut:Untuk hanya menampilkan file yang melebihi ukuran yang diberikan (mis. 1 MiB = 2 20 B), masukkan baris berikut:
Output untuk Komputer
Untuk menghasilkan output yang lebih cocok untuk diproses lebih lanjut oleh komputer, abaikan dua baris terakhir dari skrip dasar. Mereka melakukan semua pemformatan. Ini akan memberi Anda sesuatu seperti ini:
Penghapusan File
Untuk penghapusan file yang sebenarnya, lihat pertanyaan SO pada topik ini .
sumber
brew install coreutils
dan kemudian ganticut
dengangcut
dannumfmt
dengangnumfmt
.git large
siapa pun?Saya telah menemukan solusi satu-liner pada halaman wiki Departemen Fisika Zurich ETH (dekat dengan akhir halaman itu). Lakukan saja
git gc
untuk menghapus sampah basi, dan kemudianakan memberi Anda 10 file terbesar di repositori.
Ada juga solusi malas yang sekarang tersedia, GitExtensions sekarang memiliki plugin yang melakukan ini di UI (dan juga menangani penulisan ulang riwayat).
sumber
git rev-list --objects --all | grep -E `git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}' | sed ':a;N;$!ba;s/\n/|/g'`
Langkah 1 Tulis semua file SHA1s ke file teks:
Langkah 2 Mengurutkan gumpalan dari yang terbesar ke yang terkecil dan menulis hasil ke file teks:
Langkah 3a Gabungkan kedua file teks untuk mendapatkan informasi nama file / sha1 / ukuran:
Langkah 3b Jika Anda memiliki nama file atau nama jalur yang berisi spasi coba variasi Langkah 3a ini. Ini digunakan
cut
alih-alihawk
untuk mendapatkan kolom yang diinginkan termasuk. spasi dari kolom 7 hingga akhir baris:Sekarang Anda dapat melihat file bigtosmall.txt untuk memutuskan file mana yang ingin Anda hapus dari riwayat Git Anda.
Langkah 4 Untuk melakukan penghapusan (perhatikan bagian ini lambat karena akan memeriksa setiap komit dalam riwayat Anda untuk data tentang file yang Anda identifikasi):
Sumber
Langkah 1-3a disalin dari Finding and Purging Big Files From Git History
EDIT
Artikel itu dihapus pada paruh kedua 2017, tetapi salinan yang diarsipkan masih dapat diakses menggunakan Wayback Machine .
sumber
git gc && join -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 ) | sort -k2gr
join -t' ' -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sed 's/[[:space:]]/\t/' | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 | sed 's/[[:space:]]\+/\t/g' ) | sort -k2gr | less
. Perhatikan bahwa Anda harus memasukkan karakter TAB yang sebenarnya setelahjoin -t'
dengan CTRL + V <TAB> per geekbraindump.blogspot.ru/2009/04/unix-join-with-tabs.html$'\t'
akan memberi Anda tab.echo -n $'\t' | xxd -ps
->09
Anda harus menggunakan BFG Repo-Cleaner .
Menurut situs web:
Prosedur klasik untuk mengurangi ukuran repositori adalah:
sumber
--strip-biggest-blobs 500
harus dilakukanJika Anda hanya ingin memiliki daftar file besar, maka saya ingin memberi Anda satu-liner berikut:
Output siapa adalah:
Entri terakhir dalam daftar menunjuk ke file terbesar dalam sejarah git Anda.
Anda dapat menggunakan output ini untuk memastikan bahwa Anda tidak menghapus hal-hal dengan BFG yang Anda perlukan dalam sejarah Anda.
sumber
1.1, 1.2, 2.3
angka - angkanya?<filenumber>.<field>
menentukan urutan kombinasi. Lihat man.cx/join untuk informasi lebih lanjut.Jika Anda menggunakan Windows, berikut ini adalah skrip PowerShell yang akan mencetak 10 file terbesar di repositori Anda:
sumber
You cannot call a method on a null-valued expression. At line: 2 char: 1
. Namun, jawaban ini berhasil: stackoverflow.com/a/57793716/2441655 (juga lebih pendek)Coba
git ls-files | xargs du -hs --threshold=1M
.Kami menggunakan perintah di bawah ini dalam pipa CI kami, itu berhenti jika menemukan file besar di repo git:
sumber
Saya tidak dapat menggunakan jawaban yang paling populer karena
--batch-check
pergantian baris perintah ke Git 1.8.3 (yang harus saya gunakan) tidak menerima argumen apa pun. Langkah selanjutnya telah dicoba pada CentOS 6.5 dengan Bash 4.1.2Konsep Kunci
Dalam Git, istilah gumpalan menyiratkan isi file. Perhatikan bahwa komit dapat mengubah konten file atau pathname. Dengan demikian, file yang sama dapat merujuk ke gumpalan yang berbeda tergantung pada komit. File tertentu bisa menjadi yang terbesar dalam hierarki direktori dalam satu komit, sementara tidak di yang lain. Oleh karena itu, pertanyaan menemukan commit besar dan bukan file besar, menempatkan hal-hal dalam perspektif yang benar.
Untuk Yang Tidak Sabar
Perintah untuk mencetak daftar gumpalan dalam urutan ukuran menurun adalah:
Output sampel:
Untuk menghilangkan gumpalan seperti itu, gunakan BFG Repo Cleaner , seperti disebutkan dalam jawaban lain. Diberikan file
blobs.txt
yang hanya berisi hash gumpalan, misalnya:Melakukan:
Pertanyaannya adalah tentang menemukan komitmen, yang lebih berfungsi daripada menemukan gumpalan. Untuk tahu, silakan baca terus.
Pekerjaan selanjutnya
Diberi hash komit, perintah yang mencetak hash dari semua objek yang terkait dengannya, termasuk gumpalan, adalah:
Jadi, jika kita memiliki output seperti itu tersedia untuk semua komit di repo, maka diberi hash gumpalan, banyak komit adalah yang cocok dengan salah satu output. Ide ini dikodekan dalam skrip berikut:
Jika konten disimpan dalam nama file
find-commits.sh
maka doa biasa akan seperti di bawah:Seperti sebelumnya, file
blobs.txt
mencantumkan hash gumpalan, satu per baris. Itucreate_db()
fungsi menyimpan cache dari semua berkomitmen listing di sub-direktori dalam direktori saat ini.Beberapa statistik dari percobaan saya pada sistem dengan dua prosesor Intel (R) Xeon (R) CPU E5-2620 2.00GHz yang disajikan oleh OS sebagai 24 inti virtual:
Perhatikan bahwa skrip ini adalah utas tunggal. Karena itu, hanya satu inti yang akan digunakan pada satu waktu.
sumber
Solusi Powershell untuk windows git, cari file terbesar:
sumber
Mulailah dengan menganalisis, memvalidasi, dan memilih akar permasalahan. Gunakan
git-repo-analysis
untuk membantu.Anda juga dapat menemukan beberapa nilai dalam laporan terperinci yang dihasilkan oleh BFG Repo-Cleaner , yang dapat dijalankan dengan sangat cepat dengan mengkloning ke tetesan Digital Ocean menggunakan 10MiB / s throughput jaringan mereka.
sumber
Saya menemukan ini karena alasan yang sama seperti orang lain. Tetapi skrip yang dikutip tidak bekerja untuk saya. Saya telah membuat satu yang lebih hibrida dari yang saya lihat dan sekarang tinggal di sini - https://gitlab.com/inorton/git-size-calc
sumber