Saya memiliki repo GitHub yang memiliki dua cabang - master & rilis.
Cabang rilis berisi file distribusi biner yang berkontribusi pada ukuran repo yang sangat besar (> 250MB), jadi saya memutuskan untuk membersihkannya.
Pertama saya menghapus cabang rilis jarak jauh, melalui git push origin :release
Kemudian saya menghapus cabang rilis lokal. Pertama saya mencoba git branch -d release
, tetapi git berkata "kesalahan: 'Rilis' cabang bukan nenek moyang dari HEAD Anda saat ini." yang mana benar, jadi saya lakukan git branch -D release
untuk memaksanya dihapus.
Tetapi ukuran repositori saya, baik secara lokal maupun di GitHub, masih sangat besar. Jadi saya menjalankan melalui daftar perintah git yang biasa, seperti git gc --prune=today --aggressive
, tidak berhasil.
Dengan mengikuti instruksi Charles Bailey di SO 1029969 saya bisa mendapatkan daftar SHA1 untuk gumpalan terbesar. Saya kemudian menggunakan skrip dari SO 460331 untuk menemukan gumpalan ... dan lima gumpalan terbesar tidak ada, meskipun gumpalan yang lebih kecil ditemukan, jadi saya tahu skrip tersebut berfungsi.
Saya pikir blog ini adalah binari dari cabang rilis, dan entah bagaimana mereka ditinggalkan setelah cabang itu dihapus. Apa cara yang benar untuk menyingkirkannya?
Jawaban:
... dan tanpa basa-basi lagi, izinkan saya menyajikan kepada Anda perintah yang berguna ini, "git-gc-all", dijamin akan menghapus semua sampah git Anda hingga muncul variabel konfigurasi tambahan:
Anda mungkin juga perlu menjalankan sesuatu seperti ini terlebih dahulu, ya ampun, git itu rumit !!
Anda mungkin juga perlu menghapus beberapa tag, terima kasih Zitrax:
Saya memasukkan semua ini ke dalam skrip: git-gc-all-ferocious .
sumber
objects
. Apa itu dan mengapa (tampaknya) tidak relevan?Seperti yang dijelaskan di sini , jika Anda ingin menghapus secara permanen semua yang direferensikan hanya melalui reflog , cukup gunakan
git reflog expire --expire-unreachable=now --all
menghapus semua referensi tentang komitmen yang tidak dapat dijangkau direflog
.git gc --prune=now
menghapus komit itu sendiri.Perhatian : Hanya menggunakan
git gc --prune=now
tidak akan berfungsi karena komit tersebut masih direferensikan di reflog. Oleh karena itu, membersihkan reflog adalah wajib. Perhatikan juga bahwa jika Anda menggunakannyarerere
memiliki referensi tambahan yang tidak dihapus oleh perintah ini. Lihatgit help rerere
untuk lebih jelasnya. Selain itu, setiap commit yang direferensikan oleh cabang atau tag lokal atau jarak jauh tidak akan dihapus karena dianggap sebagai data yang berharga oleh git.sumber
git fetch --prune
mengurangi ukuran karena menghapus blob lokal.Seperti yang disebutkan dalam jawaban SO ini ,
git gc
sebenarnya dapat meningkatkan ukuran repo!Lihat juga utas ini
The thread yang sama menyebutkan :
Di depan cabang filter, Anda dapat mempertimbangkan (dengan hati-hati) skrip ini
sumber
filter-branch
penggunaan perintah.git gc --prune=now
, atau level rendahgit prune --expire now
.sumber
Setiap kali HEAD Anda bergerak, git melacaknya di file
reflog
. Jika Anda menghapus komit, Anda masih memiliki "komit menggantung" karena masih dirujuk olehreflog
selama ~ 30 hari. Ini adalah jaring pengaman ketika Anda menghapus komit secara tidak sengaja.Anda dapat menggunakan
git reflog
perintah menghapus komit tertentu, mengemas ulang, dll .., atau hanya perintah tingkat tinggi:sumber
Anda bisa menggunakan
git forget-blob
.Penggunaannya cukup sederhana
git forget-blob file-to-forget
. Anda bisa mendapatkan info lebih lanjut di sinihttps://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/
Ini akan hilang dari semua komit di riwayat, reflog, tag, dan sebagainya
Saya mengalami masalah yang sama sesekali, dan setiap kali saya harus kembali ke posting ini dan lainnya, itulah mengapa saya mengotomatiskan prosesnya.
Penghargaan untuk kontributor seperti Sam Watkins
sumber
Coba gunakan git-filter-branch - ini tidak menghapus gumpalan besar, tetapi dapat menghapus file besar yang Anda tentukan dari seluruh repo. Bagi saya ini mengurangi ukuran repo dari ratusan MB menjadi 12 MB.
sumber
Terkadang, alasan mengapa "gc" tidak banyak membantu adalah karena ada rebase atau simpanan yang belum selesai berdasarkan commit lama.
sumber
Untuk menambahkan tip lain, jangan lupa untuk menggunakan git remote prune untuk menghapus cabang-cabang remote Anda yang sudah usang sebelum digunakan git gc
Anda dapat melihatnya dengan git branch -a
Ini sering kali berguna ketika Anda mengambil dari github dan repositori bercabang ...
sumber
Sebelum melakukan
git filter-branch
dangit gc
, Anda harus meninjau tag yang ada di repo Anda. Setiap sistem nyata yang memiliki penandaan otomatis untuk hal-hal seperti integrasi dan penerapan berkelanjutan akan membuat objek yang tidak diinginkan masih direferensikan oleh tag ini, karenanyagc
tidak dapat menghapusnya dan Anda masih akan terus bertanya-tanya mengapa ukuran repo masih begitu besar.Cara terbaik untuk menyingkirkan semua hal yang tidak diinginkan adalah dengan menjalankan
git-filter
&git gc
lalu mendorong master ke repo kosong yang baru. Repo telanjang baru akan memiliki pohon yang dibersihkan.sumber