Conforme mencionado nesta resposta SO ,git gc
pode realmente aumentar o tamanho do repositório!
Veja também este tópico
Agora, o git possui um mecanismo de segurança para não excluir objetos não referenciados imediatamente ao executar ' git gc
'.
Por padrão, objetos não referenciados são mantidos por um período de 2 semanas. Isso facilita a recuperação de ramificações ou confirmações excluídas acidentalmente ou evita uma corrida em que um objeto recém-criado no processo de ser, mas ainda não referenciado, pode ser excluído por um git gc
processo ' ' executado em paralelo.
Portanto, para conceder esse período de cortesia aos objetos compactados, mas não referenciados, o processo de reembalagem empurra esses objetos não referenciados para fora da embalagem em sua forma solta, para que possam ser envelhecidos e eventualmente removidos.
Objetos que se tornam não referenciados geralmente não são muitos. Ter 404855 objetos não referenciados é bastante, e enviar esses objetos em primeiro lugar por meio de um clone é estúpido e um desperdício completo de largura de banda da rede.
Enfim ... Para resolver seu problema, basta executar ' git gc
' com o --prune=now
argumento para desativar esse período de carência e livrar-se desses objetos não referenciados imediatamente (seguro somente se nenhuma outra atividade git estiver ocorrendo ao mesmo tempo, o que deve seja fácil de garantir em uma estação de trabalho).
E BTW, usando ' git gc --aggressive
' com uma versão posterior do git (ou ' git repack -a -f -d --window=250 --depth=250
')
O mesmo segmento menciona :
git config pack.deltaCacheSize 1
Isso limita o tamanho do cache delta a um byte (desativando-o efetivamente) em vez do padrão 0, o que significa ilimitado. Com isso, sou capaz de reembalar esse repositório usando o git repack
comando acima em um sistema x86-64 com 4 GB de RAM e usando 4 threads (este é um quad core). O uso de memória residente cresce para quase 3,3 GB.
Se sua máquina for SMP e você não tiver RAM suficiente, poderá reduzir o número de threads para apenas um:
git config pack.threads 1
Além disso, você pode limitar ainda mais o uso da memória com a --window-memory argument
tecla ' git repack
'.
Por exemplo, o uso --window-memory=128M
deve manter um limite superior razoável no uso da memória de pesquisa delta, embora isso possa resultar em uma correspondência menos otimizada se o repositório contiver muitos arquivos grandes.
Na parte da frente do filtro, você pode considerar (com cautela) esse script
#!/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