145M = .git / objects / pack /
Eu escrevi um script para adicionar os tamanhos das diferenças de cada commit e do commit antes de voltar da ponta de cada branch. Recebo 129 MB, o que é sem compactação e sem contabilizar os mesmos arquivos entre filiais e histórico comum entre filiais.
O Git leva todas essas coisas em consideração, então eu esperaria um repositório muito menor. Então, por que o .git é tão grande?
Eu fiz:
git fsck --full
git gc --prune=today --aggressive
git repack
Para responder sobre quantos arquivos / confirmações, tenho 19 ramificações, aproximadamente 40 arquivos em cada. 287 confirmados, encontrados usando:
git log --oneline --all|wc -l
Não deve demorar 10 megabytes para armazenar informações sobre isso.
git repack -a -d
reduzi meu repo de 956 MB para 250 MB . Grande sucesso! Obrigado!Respostas:
Recentemente, puxei o repositório remoto errado para o local (
git remote add ...
egit remote update
). Depois de excluir a referência remota indesejada, ramificações e tags, eu ainda tinha 1,4 GB (!) De espaço desperdiçado no meu repositório. Eu só consegui me livrar disso clonando-ogit clone file:///path/to/repository
. Observe que issofile://
faz muita diferença ao clonar um repositório local - apenas os objetos referenciados são copiados, não toda a estrutura de diretórios.Edit: Aqui está uma linha de Ian para recriar todas as filiais no novo repositório:
fonte
Alguns scripts que eu uso:
git-fatfiles
Se você quiser mais linhas, consulte também a versão Perl em uma resposta vizinha: https://stackoverflow.com/a/45366030/266720
erradicar git (para
video/parasite.avi
):Nota: o segundo script foi projetado para remover completamente as informações do Git (incluindo todas as informações dos reflogs). Use com cuidado.
fonte
git-fatfiles
script antigo ( ) surgiu quando eu fiz a pergunta no IRC (Freenode / # git). Salvei a melhor versão em um arquivo e a postei como resposta aqui. (Embora não seja possível o autor original nos logs do IRC).git gc
já fazgit repack
isso, então não faz sentido reembalar manualmente, a menos que você esteja passando algumas opções especiais para ele.A primeira etapa é verificar se a maioria do espaço é (como normalmente seria o caso) o seu banco de dados de objetos.
Isso deve fornecer um relatório de quantos objetos descompactados existem em seu repositório, quanto espaço eles ocupam, quantos arquivos de pacote você tem e quanto espaço eles ocupam.
Idealmente, após uma reembalagem, você não teria objetos descompactados e um arquivo de pacote, mas é perfeitamente normal ter alguns objetos que não são diretamente referenciados pelas ramificações atuais ainda presentes e descompactados.
Se você tiver um único pacote grande e quiser saber o que está ocupando o espaço, poderá listar os objetos que compõem o pacote, além de como eles são armazenados.
Observe que
verify-pack
leva um arquivo de índice e não o próprio arquivo de pacote. Isso fornece um relatório de cada objeto no pacote, seu tamanho real e seu tamanho, bem como informações sobre se ele foi 'deltificado' e, em caso afirmativo, a origem da cadeia delta.Para verificar se existem objetos invulgarmente grandes no seu repositório, você pode classificar a saída numericamente na terceira da quarta coluna (por exemplo
| sort -k3n
).Nesta saída, você poderá ver o conteúdo de qualquer objeto usando o
git show
comando, embora não seja possível ver exatamente onde no histórico de consolidação do repositório o objeto é referenciado. Se você precisar fazer isso, tente algo com esta pergunta .fonte
Apenas para sua informação, a maior razão pela qual você pode acabar mantendo objetos indesejados é que o git mantém um reflog.
O reflog está lá para salvar sua bunda quando você acidentalmente excluir sua ramificação principal ou de alguma forma danificar catastroficamente seu repositório.
A maneira mais fácil de corrigir isso é truncar seus reflogs antes de compactá-los (apenas certifique-se de que você nunca deseja voltar a nenhum dos commits no reflog).
Isso é diferente,
git gc --prune=today
pois expira todo o reflog imediatamente.fonte
Se você deseja descobrir quais arquivos estão ocupando espaço em seu repositório git, execute
git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5
Em seguida, extraia a referência de blob que ocupa mais espaço (a última linha) e verifique o nome do arquivo que ocupa muito espaço
git rev-list --objects --all | grep <reference>
Pode até ser um arquivo que você removeu
git rm
, mas o git se lembra porque ainda existem referências a ele, como tags, controles remotos e reflog.Depois de saber de qual arquivo você deseja se livrar, eu recomendo usar
git forget-blob
https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/
É fácil de usar, basta fazer
git forget-blob file-to-forget
Isso removerá todas as referências do git, removerá o blob de todos os commit no histórico e executará a coleta de lixo para liberar espaço.
fonte
O script git-fatfiles da resposta de Vi é adorável se você quiser ver o tamanho de todos os seus blobs, mas é tão lento que pode ser inutilizado. Eu removi o limite de saída de 40 linhas e ele tentou usar toda a RAM do meu computador em vez de terminar. Então, eu a reescrevi: isso é milhares de vezes mais rápido, adicionou recursos (opcional) e algum bug estranho foi removido - a versão antiga daria contagens imprecisas se você soma a saída para ver o espaço total usado por um arquivo.
Nomeie git-fatfiles.pl e execute-o. Para ver o espaço em disco usado por todas as revisões de um arquivo, use a
--sum
opção Para ver a mesma coisa, mas para arquivos em cada diretório, use a--directories
opção Se você instalar o número :: Bytes :: Humano módulo CPAN (run "cpan Número :: Bytes :: Humanos"), os tamanhos será formatado: "/path/to/file.mp4 21M".fonte
Tem certeza de que está contando apenas os arquivos .pack e não os arquivos .idx? Eles estão no mesmo diretório que os arquivos .pack, mas não possuem nenhum dado do repositório (como a extensão indica, eles nada mais são do que índices para o pacote correspondente - na verdade, se você souber o comando correto, poderá recrie-os facilmente a partir do arquivo do pacote, e o próprio git faz isso ao clonar, pois apenas um arquivo de pacote é transferido usando o protocolo git nativo).
Como uma amostra representativa, dei uma olhada no meu clone local do repositório linux-2.6:
O que indica uma expansão de cerca de 7% deve ser comum.
Existem também os arquivos externos
objects/
; na minha experiência pessoal, elesindex
egitk.cache
tendem a ser os maiores (totalizando 11 milhões no meu clone do repositório linux-2.6).fonte
Outros objetos git armazenados em
.git
incluem árvores, confirmações e tags. As confirmações e tags são pequenas, mas as árvores podem ficar grandes, principalmente se você tiver um número muito grande de arquivos pequenos no seu repositório. Quantos arquivos e quantas confirmações você possui?fonte
Você tentou usar o git repack ?
fonte
antes de executar o git filter-branch e o git gc, revise as tags presentes no seu repositório. Qualquer sistema real que possua etiquetagem automática para coisas como integração e implantações contínuas fará com que objetos não datados ainda sejam atualizados por essas tags, portanto, o gc não poderá removê-las e você continuará se perguntando por que o tamanho do repo ainda é tão grande.
A melhor maneira de se livrar de todas as coisas indesejadas é rodar o git-filter & git gc e depois empurrar o master para um novo repositório. O novo repositório vazio terá a árvore limpa.
fonte
Isso pode acontecer se você adicionou um grande pedaço de arquivos acidentalmente e os preparou, não necessariamente os compromete. Isso pode acontecer em um
rails
aplicativo quando você executarbundle install --deployment
e, em seguida, acidentalmentegit add .
, então você ver todos os arquivos adicionados sobvendor/bundle
você unstage eles, mas eles já tem na história git, então você tem que aplicar a resposta de Vi e mudançavideo/parasite-intro.avi
devendor/bundle
seguida, executar o segundo comando que ele proporciona.Você pode ver a diferença com a
git count-objects -v
qual, no meu caso, antes de aplicar o script tinha um pacote de tamanho: de 52K e depois de aplicá-lo era de 3,8K.fonte
Vale a pena conferir o stacktrace.log. É basicamente um log de erros para rastrear confirmações que falharam. Descobri recentemente que meu stacktrace.log é de 65,5 GB e meu aplicativo é de 66,7 GB.
fonte