Existe uma maneira de reduzir o tamanho da pasta git?

156

Parece que meu projeto está ficando cada vez maior a cada git commit/push. Existe uma maneira de limpar minha pasta git?

Sheehan Alam
fonte

Respostas:

214

Não tenho certeza do que você quer. Primeiro de tudo, é claro que toda vez que você confirmar / enviar push ao diretório, ele ficará um pouco maior, pois ele precisará armazenar cada um desses commit adicionais.

Entretanto, provavelmente você deseja git gcquais "limparão arquivos desnecessários e otimizarão o repositório local" ( página de manual ).

Outro comando possivelmente relevante é o git cleanque excluirá arquivos não rastreados da sua árvore ( página de manual ).

houbysoft
fonte
30
O git clean -d -f -x exclui os arquivos listados em .gitignore e outros. Por exemplo, espaços de trabalho que não pertencem em git, pasta Pods, etc.
Kalle
102
WARNINGO comando descrito acima por @Kalle removerá TODOS > <ARQUIVOS E DIRETÓRIOS NÃO CONTROLADOS DENTRO DO GIT ROOT , não apenas "arquivos listados em .gitignore". Qualquer coisa que não esteja sendo rastreada pelo Git, independentemente de estar ou não listada, .gitignoreserá apagada. git clean -dfX(observe o caso no X) removerá apenas itens com uma regra aplicável .gitignore. Preste atenção a este aviso: nunca execute git cleansem executá-lo no modo interativo, em -ivez de -f, ou pelo menos executando primeiro a seco - -ne depois novamente com -f.
Adrian Günter
5
Ou fazer uma cópia de segurança :-)
Mateen Ulhaq
61

Corre:

git remote prune origin

Exclui todas as ramificações de rastreamento antigas que já foram removidas, originmas ainda estão disponíveis localmente em remotes/origin.

git gc --auto

' G arbage C ollection' - executa tarefas domésticas tarefas (compressas revisões, remove perder / objetos inacessíveis). O --autosinalizador primeiro determina se algum trabalho é necessário e sai sem fazer nada, se não.

phamductri
fonte
4
Alguma explicação do que aqueles fazem? Sei que podemos pesquisá-los no Google e procurar sua documentação, mas é uma prática comum fornecer uma breve descrição de sua resposta quando ela envolve apenas código ou comandos.
Dzhuneyt
28

Um cenário em que seu repositório git ficará muito maior a cada confirmação é aquele em que você está enviando arquivos binários gerados regularmente. O armazenamento deles não será tão eficiente quanto o arquivo de texto .

Outro é aquele em que você tem um grande número de arquivos em um repositório (que é um limite de git ) em vez de vários sub-repositórios ( gerenciados como sub-módulos ).

Neste artigo sobre o espaço git , o AlBlue menciona:

Observe que o Git (e o Hg e outros DVCSs) sofrem de um problema no qual os binários (grandes) são registrados e excluídos, pois ainda aparecerão no repositório e ocuparão espaço, mesmo se não estiverem atualizados. .

Se você possui binários grandes armazenados em seu repositório git, considere:

Como mencionei em " Quais são os limites de arquivo no Git (número e tamanho)? ", O mais recente (2015, 5 anos após esta resposta) Git LFS do GitHub é uma maneira de gerenciar esses arquivos grandes (armazenando-os fora do diretório Repositório Git).

VonC
fonte
1
O suporte ao git para arquivos grandes é útil se você tiver arquivos binários grandes (como imagens) rotineiramente sendo adicionados / atualizados. Veja git-lfs.github.com . Super fácil de implementar, suportado pelo github. Todos os membros da equipe precisam instalá-lo para fazer uso colaborativo.
Eric Woods,
@EricWoods True. Eu mencionei o Git-LFS antes (64 vezes: stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs ). Eu editei esta resposta antiga em conformidade.
VonC 11/12/19
Ha, de fato! Engraçado como uma resposta de 9 anos de idade ainda é relevante (e agora ainda mais com as informações do LFS).
Eric Woods
22

sim sim, git gcé a solução, naturalmente,

e localmente - você pode simplesmente excluir o repositório local e cloná-lo novamente,

mas há algo mais importante aqui ...

os segundos em que você espera que esse enorme processo externo sejam processados ​​são coletados por longos minutos nos quais são coletadas horas de tempo ineficiente gasto,

Crie um novo repositório (inteiramente, não apenas uma filial) do zero , incluindo a única versão recente dos arquivos, naturalmente você perderá todo o histórico,

mas quando no mundo do código não é hora de se sentir sentimental, não faz sentido arrastar todos os 5 anos de código a cada commit ou diff, você ainda pode armazenar o antigo git & externals em algum lugar, se sentir nostalgia:]

mas, em algum momento, você realmente precisa seguir em frente:]

sua equipe vai agradecer!

Comunidade
fonte
12
Concordo plenamente, recentemente adotamos essa abordagem com um repositório antigo e não olhamos para trás; bem, principalmente porque não podemos, mas você sabe o que quero dizer :)
WhatIsHeDoing
13

A execução deste comando é extremamente perigosa, mas reduzirá seu repositório apagando todos os seus arquivos de recuperação / backup do git:

git reflog expire --expire=now --all && git gc --prune=now --aggressive

Ele apagará todos os arquivos que o git usa para recuperar seu repositório de algum comando incorreto; por exemplo, se você o fez git reset --hard, geralmente poderá recuperar os arquivos perdidos. Mas se você faz git reset --hardantes do git reflog expire...comando, perde tudo. Agora, sua única esperança é usar alguma ferramenta que analise seu sistema de arquivos e tente recuperar os arquivos apagados, se eles não forem substituídos.

do utilizador
fonte
3
Eu realmente não chamaria isso de extremamente perigoso . Eu apenas rotularia algo com o qual você deve ter cuidado . Na minha experiência, muito poucos realmente tocam o reflog ou objetos inacessíveis - a maioria nem sabe que eles estão lá ou como interagir com eles, e ficam presos em situações em que seriam úteis, ou fazem coisas terrivelmente maneira ineficiente. Eu diria que se você não souber e não conseguir descobrir o que esses comandos farão, poderá executá-los com segurança!
Chris Morgan
10

git clean -d -f -i é a melhor maneira de fazer isso.

Isso ajudará a limpar de maneira mais controlada.

-i significa interativo.

anandharshan
fonte
3
Embora a pergunta do OP seja vaga, e essa seja uma boa resposta a esse respeito, quero ressaltar que git cleannão é para limpar o repositório, mas para limpar o diretório. Para usuários que copiam / colam cegamente, tenha cuidado; isso remove arquivos / diretórios não rastreados que você pode realmente querer localmente.
21418 srboy
git limpo -d -x -f funciona muito bem se você quiser limpeza profunda
Rishabh Jain
2

Não sei se o encolherá, mas depois que corro git clean, também o faço git repack -ad, o que reduz o número de arquivos de pacote.

Damien Sawyer
fonte
5
repack é uma parte do git gcprocesso, assim não há necessidade de executá-lo separadamente
artkoshelev