Ontem eu e o colega Marcos Garcia nos deparamos com uma situação que acabou nos ensinando mais um truque do git Um dos repositórios privados da Coderockr no Github tem uma estrutura parecida com essa:

Design - arquivos PSD e PNG com as telas do projeto
Docs - documentações do projeto
Android - porção Android 
iOS - porção de códigos para o iPhone/iPad
Web - interface de administração do projeto, acessível via web
library - diretório com entidades e webservices usado pelo projeto

A nossa necessidade era de fazer o deploy para o nosso servidor web apenas da pasta Web do projeto, não necessitando das demais. O git permite fazer algo assim usando submodulos mas não era exatamente o que procurávamos, principalmente porque cada submodulo deve ser um repositório separado no Github, o que iria aumentar os nossos custos mensais. Depois de algumas pesquisas no Google o Marcos encontrou a solução pro problema: o git sparse checkouts, uma opção que foi lançada com a versão 1.7 do git. Para exemplificar o uso, no nosso servidor agora fazemos o seguinte:

git clone <repository_url> <directory>
cd <directory>

Habilitamos a opção do sparse checkout

git config core.sparsecheckout true

Indicamos quais diretórios queremos ter acesso:

echo Web >> .git/info/sparse-checkout
echo library >> .git/info/sparse-checkout

E rodamos o comando read-tree para atualizar a árvore de diretórios

git read-tree -m -u HEAD

Se verificar com o comando ls é possível ver que os outros diretórios desapareceram do diretório do projeto Quando rodarmos um git pull para atualizar, apenas os diretórios Web e library serão atualizados. Com isso conseguimos resolver o nosso problema sem aumentar os nossos custos ;)