Como reduzir a pasta .git

134

Minha base atual tem um tamanho total de aprox. 200MB.

Mas minha pasta .git tem um tamanho incrível de 5 GB (!). Como eu envio meu trabalho para um servidor externo, não preciso de nenhum histórico local grande ...

Como reduzir a pasta .git para liberar espaço no meu notebook? Posso excluir todas as alterações anteriores a 30 dias?

Muito obrigado por qualquer ajuda :)

JMW
fonte
2
Você pode postar a saída de git count-objects -v?
CB Bailey
2
Possível duplicata do Reduzir tamanho do repositório git
sds 23/02

Respostas:

113

você não deve excluir todas as alterações anteriores a 30 dias (acho que é possível explorar o git, mas realmente não é recomendado).

você pode chamar git gc --aggressive --prune, o que executará a coleta de lixo em seu repositório e removerá objetos antigos. você tem muitos arquivos binários (arquivos, imagens, executáveis) que mudam frequentemente? essas geralmente levam a enormes pastas .git (lembre-se, o git armazena instantâneos para cada revisão e os arquivos binários são compactados mal)

knittl
fonte
32
Na verdade, git gc --aggressiveé considerado uma má prática. É melhor usar git repack -a -d --depth=250 --window=250.
Artefact2
18
@knittl: absolutamente. Aqui está uma mensagem do próprio Linus: gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Artefact2
3
@ artefact2: obrigado pelo link! Eu li e lembro, que - agressivo não reutilizará (bons) deltas - que parecem não existir nesta questão, porque o repositório é enorme. seguir o caminho da reembalagem levará muito mais tempo. git gc --aggressivechama reembalar com um tamanho de janela de 250 (consulte a página de manual) e uma profundidade de 250 (consulte o código-fonte). --aggressive adicionalmente adiciona o -fswitch, para jogar fora e refazer todas as operações delta anteriores (como também mencionado no link)
knittl
1
Acabei de verificar o repositório hg.nginx.org/nginx (RELEASE-1.4.0 é dica) usando o git-remote-hg e isso resultou em um repositório de cerca de 100 MB. O uso git gc --aggressive --prunereduziu para 19 MB.
Lekensteyn
15
@ Artefact2 Sua declaração está desatualizada : observe a idade dessa publicação. De fato, no mesmo dia em que foi postada, a discussão na lista de correspondência resultou neste commit: [..] Portanto, os parâmetros de empacotamento são os mesmos atualmente para qualquer método. . --prunetambém não é necessário, pois se tornou o padrão desde v1.5.5-rc0(commit 25ee973 , março de 2008).
Lekensteyn
68

Aqui está o que o criador do git Linus tem a dizer sobre como reduzir seu repositório git:

O equivalente a "git gc --aggressive" - ​​mas feito * corretamente * - é fazer (durante a noite) algo como

   git repack -a -d --depth=250 --window=250

onde essa profundidade é a profundidade das cadeias delta (aumentá-las para a história antiga - vale a pena a sobrecarga do espaço), e a questão da janela é o tamanho de uma janela de objeto que queremos que cada candidato a delta escaneie.

E aqui, você pode querer adicionar o sinalizador "-f" (que é o "excluir todos os deltas antigos", pois agora você está realmente tentando garantir que este realmente encontre bons candidatos.

fonte: http://gcc.gnu.org/ml/gcc/2007-12/msg00165.html

Isso eliminará os dados binários que ficam órfãos no meu repositório? O "git repack" não se livra das imagens ou dos dados binários que você verificou no seu repositório e os excluiu. Para excluir esse tipo de dados permanentemente do seu repositório, você deve reescrever seu histórico. Um exemplo comum disso é quando você acidentalmente verifica suas senhas no git. Você pode voltar e excluir alguns arquivos, mas precisará reescrever seu histórico a partir de agora até agora e depois forçar o push e o novo repo à sua origem.

David Dehghan
fonte
Para mim, a pasta .git é de cerca de 1.5G. Eu tentei isso, mas recebi o seguinte erro. fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
Miron
2
Depois de executar repacklocalmente, fazendo um commit e um push, o psiquiatra também será remoto?
Timo
@ David Dehghan: Ei, eu tentei isso no diretório do projeto, mas o tamanho da pasta .git não mudou. Isso é esperado ou preciso pressionar para ver as alterações? (desculpe não ter muita experiência com o git.) Tenho uma imagem / gif no repositório e comprometi várias vezes versões diferentes dessa imagem e suponho que esse tamanho aumentado do .git.
Giorgim #
Oi, infelizmente, agora é assim que você limpa a versão binária antiga. Para fazer isso, você precisa reescrever sua história, o que é realmente complicado. Aqui estão algumas chumbo para você: docs.microsoft.com/en-us/azure/devops/articles/...
David Dehghan
22

Eu tentei isso, mas meu repositório ainda era muito grande. O problema foi que eu acidentalmente verifiquei alguns arquivos grandes gerados. Após algumas pesquisas, encontrei um ótimo tutorial que facilita a exclusão dos grandes arquivos gerados. Este tutorial me permitiu reduzir meu repositório de 60 MB para <1 MB.

Steve Lorek, Como Encolher um Repositório Git

Chris Hinshaw
fonte
4
Aqui está uma versão arquivada em caso de podridão do link. Essa resposta é / foi útil para um repo me deparei onde .exe e arquivos .zip foram cometidos que inchado o tamanho da pasta .git
DoubleDown
9

5GB vs 200MB é meio estranho. Tente correr git gc.

Mas não, a menos que você divida seu repositório em módulos, não poderá diminuir o tamanho do .gitdiretório.

Cada clone de um repositório git é um repositório completo que pode atuar como um servidor. Esse é o princípio básico do controle de versão distribuído.

Šimon Tóth
fonte
3

Estou usando o git mais como mecanismo de sincronização do que no histórico de versões. Portanto, minha solução para esse problema foi garantir que todas as minhas fontes atuais estejam em um estado satisfatório e excluir apenas .git e reinicializar os repositórios. Problema em espaço em disco resolvido. :-) História perdida :-( Faço isso porque meu repositório está em uma pequena chave USB. Não quero nem preciso de toda a minha história. Se eu tivesse um método para apenas truncar a história, usaria isso.

Se eu estivesse interessado em manter meu histórico, arquivaria o repositório atual. Em algum momento depois, eu poderia clonar o repositório original, copiar todas as alterações do novo repositório (suponha que eu não tenha feito muito (nenhum) renomear ou excluir). E faça um grande commit que represente todas as alterações feitas no novo repositório como um único commit no antigo repositório. É possível mesclar as histórias? Talvez se eu usasse um ramo e excluísse os objetos que não precisava. (Eu não sei o suficiente sobre os internos do git para começar a brincar assim).

Darrel Lee
fonte
1
Você pode apenas usar o Dropbox para este caso de uso. Eu fiz por muitos anos.
31418 Jonny
0

Tentei acima dos métodos, nada funcionou no meu caso (onde acidentalmente matei o processo git durante o git push), então finalmente tive que excluir o repositório e cloná-lo novamente e agora a pasta .git é de tamanho normal.

JerryGoyal
fonte
Eu tive que usar a mesma solução porque meu disco estava cheio (a pasta .git tinha> 90 GB), então eu não conseguia nem executar uma reembalagem ou o git gc!
Fl4v