Bahsedildiği gibi bu SO cevap , git gc
aslında repo boyutunu artırabilirsiniz!
Ayrıca bu konuya bakın
Şimdi git bir güvenlik mekanizması vardır değil 'çalıştırırken hemen silme başvurulmayan nesneleri git gc
'.
Varsayılan olarak, başvurulmayan nesneler 2 hafta boyunca tutulur. Bu, yanlışlıkla silinen dalları veya taahhütleri kurtarmanızı kolaylaştırmak veya süreçte yeni oluşturulmuş ancak henüz referans verilmemiş bir nesnenin git gc
paralel olarak çalışan bir ' ' işlemle silinebileceği bir yarıştan kaçınmak içindir .
Dolayısıyla, paketlenmiş ancak referansta bulunulmayan nesnelere bu yetkisiz dönemi vermek için, yeniden paketleme işlemi bu referansta bulunulmayan nesneleri paketin dışına, yaşlanabilmeleri ve sonunda budamaları için gevşek biçimlerine iter.
Referans alınmayan nesneler genellikle çok fazla değildir. 404855 referans alınmayan nesnelere sahip olmak oldukça fazla ve bu nesneleri ilk etapta bir klon aracılığıyla göndermek aptalca ve ağ bant genişliğinin tamamen boşa harcanması.
Her neyse ... Sorununuzu çözmek için, bu yetkisiz kullanım süresini devre dışı bırakmak ve bu başvurulmayan nesnelerden hemen kurtulmak git gc
için --prune=now
argüman ile koşmanız yeterlidir (yalnızca aynı anda başka git etkinlikleri gerçekleşmiyorsa güvenli olmalıdır) bir iş istasyonunda sağlanması kolay olmalıdır).
Ve BTW, git gc --aggressive
daha sonraki bir git sürümüyle (veya ' git repack -a -f -d --window=250 --depth=250
') ' ' kullanarak
Aynı diş söz :
git config pack.deltaCacheSize 1
Bu, delta önbellek boyutunu varsayılan 0 yerine bir bayta (etkin bir şekilde devre dışı bırakarak) sınırlar, bu da sınırsız anlamına gelir. Bununla git repack
birlikte, 4GB RAM'li bir x86-64 sisteminde yukarıdaki komutu kullanarak ve 4 iş parçacığı kullanarak (bu bir dört çekirdekli) bu depoyu yeniden paketleyebiliyorum . Yerleşik bellek kullanımı yine de yaklaşık 3,3 GB'a çıkar.
Makineniz SMP ise ve yeterli RAM'e sahip değilseniz, iş parçacığı sayısını yalnızca bire düşürebilirsiniz:
git config pack.threads 1
Ek olarak, bellek kullanımını --window-memory argument
' git repack
' ile daha da sınırlayabilirsiniz .
Örneğin --window-memory=128M
, depo çok sayıda büyük dosya içeriyorsa , kullanmak delta arama belleği kullanımında makul bir üst sınır tutmalıdır, ancak bu, depo çok sayıda büyük dosya içeriyorsa daha az optimum delta eşleşmesine neden olabilir.
Filtre dalı cephesinde, bu komut dosyasını (dikkatli bir şekilde) düşünebilirsiniz.
#!/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