Git e LFS em projetos Unity
No meu post Comparando delegates e Unity Events o leitor Carlos Roger fez um comentário pergutando sobre versionamento de aquivos grandes no Git, e deixou como sugestão um post sobre o assunte. Neste post vou descrever como projetos Unity podem tirar vantagem do Git Large File System (LFS).
A ideia por trás do LFS é armazenar arquivos grandes como audio, textura, vídeo, PSD, entre outros, em um servidor remoto. No repositório do Git cada arquivo armazenado no LFS se torna um arquivo texto com informações sobre onde está o arquivo real no LFS. A vantagem disso é que estes arquivos não contam para o tamanho do repositório, deixam o git clone
e git fetch
mais rápidos, e os arquivos podem ter até alguns gigas de tamanho (não recomendado, mas pode.
O LFS tem um arquivo de configuração próprio chamado .gitattributes
que faz o track de arquivos que devem ficar no armazenamento externo ao repositório. Este arquivo pode fazer track de arquivos por nome, mas o idea é fazer por extensão de arquivo. Assim, todo arquivo novo daquele tipo já vai para o LFS automaticamente usando o mesmo comando git add
que os arquivos no repostório.
Copiei o exemplo abaixo do site do Git LFS. O primeiro bloco instala o LFS no repositório, adiciona a extensão PSD para entrar automaticamente no LFS, e por fim adiciona o arquivo gerado por este comando no Git. A primeira e terceira linhas são necessárias apenas na primeira vez que está configurando o LFS, depois só é necessário adicionar os arquivos no track do LFS.
Uma vez que o LFS está configurado, é só utilizar os comandos do Git para adicionar arquivos de fazer push deles no repositório. É neste momento que o LFS substitui o arquivo por um texto e sobe o arquivo real para o armazenamento externo ao repositório.
Não existe muito mistério, é bem simples de utilizar. Porém, vale a pena descrever alguns detalhes. Por padrão o LFS não é instalado junto com o Git, é necessário baixar o instalador para Windows ou utilizar o Homebrew para MacOS (existem outras formas, mas recomendo essa). Softwares como Sourcetree instalam o LFS junto com o Git, não sendo necessário rodar os comandos do LFS mas é sempre bom conhecer como funcionam.
Outro detalhe é que, após realizar um git clone
, é necessário rodar o git lfs install
para que o Git possa baixar os arquivos reais localmente (isso não é automático). É bem comum esquecer de iniciar o LFS e não conseguir rodar o projeto por que os arquivos reais não foram baixados. Para isso, é necessário rodar os comandos git lfs fetch
e git lfs pull
, após iniciar o LFS.
Uma conta gratuíta no GitHub e no Bitbucket te dão direito a 1GB de armazenamento no seus respectiveos servidores LFS, e isso não conta para o tamanho do repositório. Mas, dependendo do tamanho do projeto, 1GB é muito pouco. Em ambos serviços é possível comprar armazenamento extra por um valor mensal, sendo $5 dólares por 50GB adicionais no GitHub e $10 dólares por 5GB no Bitbucket.
Para projetos médios e grandes com muitos arquivos pesados é recomendado utilizar o LFS e contratar o espaço extra necessário. Como o GitHub agora tem repositórios privados gratuitos ilimitados, ele tem o melhor custo benefício.
Outra dica que vou deixar neste post é utilizar o .gitignore
do GitHub para projetos Unity. É possível adicionar este arquivo automaticamente na hora de criar um repositório novo no GitHub, com na imagem abaixo.
O .gitignore
do GitHub, junto com o LFS, é tudo que você precisa para manter seu projeto Unity bem organizado, junto com a utilização do modelo de desenvolvimento git-flow.