Seperti yang disebutkan dalam jawaban SO ini ,git gc
sebenarnya dapat meningkatkan ukuran repo!
Lihat juga utas ini
Sekarang git memiliki mekanisme keamanan untuk tidak langsung menghapus objek yang tidak direferensikan saat menjalankan 'git gc
'.
Secara default, objek yang tidak direferensikan disimpan selama jangka waktu 2 minggu. Ini untuk memudahkan Anda memulihkan cabang atau komitmen yang terhapus secara tidak sengaja, atau untuk menghindari perlombaan di mana objek yang baru saja dibuat dalam proses menjadi tetapi belum direferensikan dapat dihapus dengan proses ' git gc
' yang berjalan secara paralel.
Jadi untuk memberikan masa tenggang itu ke objek yang dikemas tetapi tidak direferensikan, proses pengemasan ulang mendorong objek yang tidak direferensikan tersebut keluar dari paket ke dalam bentuk longgar sehingga mereka dapat berumur dan akhirnya dipangkas.
Objek yang menjadi tidak direferensikan biasanya tidak banyak. Memiliki 404855 objek yang tidak direferensikan cukup banyak, dan mengirim objek tersebut pada awalnya melalui klon adalah tindakan bodoh dan pemborosan bandwidth jaringan.
Pokoknya ... Untuk mengatasi masalah Anda, Anda hanya perlu menjalankan ' git gc
' dengan--prune=now
argumen untuk menonaktifkan masa tenggang itu dan segera menyingkirkan objek yang tidak direferensikan itu (aman hanya jika tidak ada aktivitas git lain yang berlangsung pada saat yang sama yang seharusnya mudah dipastikan di workstation).
Dan BTW, menggunakan ' git gc --aggressive
' dengan versi git yang lebih baru (atau ' git repack -a -f -d --window=250 --depth=250
')
The thread yang sama menyebutkan :
git config pack.deltaCacheSize 1
Itu membatasi ukuran cache delta menjadi satu byte (secara efektif menonaktifkannya) daripada default 0 yang berarti tidak terbatas. Dengan itu saya dapat mengemas ulang repositori itu menggunakan git repack
perintah di atas pada sistem x86-64 dengan RAM 4GB dan menggunakan 4 utas (ini adalah quad core). Penggunaan memori residen tumbuh hampir 3,3 GB.
Jika mesin Anda SMP dan Anda tidak memiliki RAM yang cukup, Anda dapat mengurangi jumlah utas menjadi hanya satu:
git config pack.threads 1
Selain itu, Anda selanjutnya dapat membatasi penggunaan memori dengan --window-memory argument
to ' git repack
'.
Misalnya, penggunaan --window-memory=128M
harus menjaga batas atas yang wajar pada penggunaan memori pencarian delta meskipun ini dapat mengakibatkan kecocokan delta yang kurang optimal jika repo berisi banyak file besar.
Di depan cabang filter, Anda dapat mempertimbangkan (dengan hati-hati) skrip ini
#!/bin/bash
set -o errexit
# Author: David Underhill
# Script to permanently delete files/folders from your git repository. To use
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2
if [ $# -eq 0 ]; then
exit 0
fi
# make sure we're at the root of git repo
if [ ! -d .git ]; then
echo "Error: must run this script from the root of a git repository"
exit 1
fi
# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD
# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune