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)?