.git muito pesada

6 respostas Resolvido
git
T

Olá, eu possuo um projeto JavaFX bem simples e leve aqui. Eu notei que na hora de clonar ele está demorando bastante. E fui ver o porque disso. Todas as pastas pesam mais ou menos 1mb, porque realmente é um projeto pequeno. Porém a pasta .git é insanamente grande:

Alguém sabe me explicar isso?

6 Respostas

L
Solucao aceita

Mano, não sei se você sabe disso (ignore se souber), mas o git salva as diferenças entre os commits. Se você tem um arquivo com uma linha salvo num commit, adiciona uma linha (ou altera/apaga) nesse arquivo e faz outro commit, o git vai salvar só a alteração. Certo?

Para reconstruir um arquivo, ele sai percorrendo a árvore de commits do momento que o arquivo foi criado até o commit atual, obtendo assim a versão correspondente.

Isso funciona muito bem com arquivos de texto (e consequentemente arquivos de código fonte), mas é uma parada extremamente problemática com arquivos binários. Quando você faz commit numa imagem, por exemplo, ele salva a imagem inteira. Se você alterar qualquer coisinha na imagem, o binário vai mudar praticamente tudo, e o git vai entender que cada mudança de linha deve ser salva. Inclusive, existem formatos binários (algo bem comum) que os dados são todos salvos em uma linha só. Ou seja, se você alterar 1 bit daquela linha gigantesca, o git vai duplicar tudo.

Você tem arquivos binários no teu projeto (imagem, música, diagrama de banco de dados, qualquer coisa que não seja texto)?

T

Eu tinha um banco de dados HSQLDB e 2 .exe. Daí eu removi eles porque eu achei que eram eles que estavam pesando o projeto.

L

Pode ser isso. Tipo, toda vez que você mexe um pouco em um binário, ele é quase que completamente substituído.

Mesmo que você apague e faça commit da exclusão, esses arquivos (cada alteração) estão salvos na árvore de commits. Por isso, você tem que excluir o histórico desse arquivo (o registro em cada commit). Eu não tenho ideia de como fazer isso, mas pesquisei aqui e achei isso aqui no suporte do GitHub: Removing files from a repository’s history. Ele diz pra usar o comando git filter-branch (nunca usei nem tenho ideia de como usa) ou então a ferramenta BFG Repo-Cleaner que faz isso para ti.

T

Valeu mesmo cara, entendi agora.

I

Ueh, mas o .git ta sendo versionado? digo, está commitado no projeto?

T

Acho que não, eu usei uma ferramenta gráfica desde o início. O Gitkraken. Creio que a ferramenta não faria nada do tipo.

Criado 7 de junho de 2017
Ultima resposta 7 de jun. de 2017
Respostas 6
Participantes 3