Se você deseja extrair o conteúdo de um repositório Git, talvez para torná-lo disponível para uma fonte de download em algum lugar, então você pode, é claro, zipar (ou tar) o conteúdo do repositório com uma ferramenta de linha de comando.
No entanto, há uma outra maneira de fazer isso com um repositório Git, usando o comando git archive. Isso leva o conteúdo da tree de trabalho atual e gera um arquivo zip (ou tar).
Uma das principais vantagens de usar Git para executar o arquivo em vez de uma ferramenta de linha de comando é evitar que acidentalmente capture o (grande) diretório .git, ou qualquer conteúdo do trabalho em andamento. Por exemplo, se você acabou de executar um build, em seguida, zip (tar) vai incluir o conteúdo da saída do build também.
Outra vantagem é que você pode extrair o conteúdo do repositório em uma revisão arbitrária. Enquanto HEAD é usado por padrão, você pode colocá-lo em qualquer tree ou tag na extração, o que o torna útil para ser capaz de gerar uma tar ball de uma determinada tag (mesmo que a tree não seja a padrão). Por exemplo, digamos que queria gerar um aglomerado de fontes do repositório EGit
(master) $ git archive --format tar v1.0.0.201106090707-r | gzip -9 > /tmp/egit-v1.0.0.tgz
(master) $ tar tzf /tmp/egit-v1.0.0 | head
.eclipse_iplog
.gitattributes
EGIT_INSTALL
LICENSE
README
SUBMITTING_PATCHES
org.eclipse.egit-feature/
org.eclipse.egit-feature/.gitignore
org.eclipse.egit-feature/.project
org.eclipse.egit-feature/.settings/
Esse recurso é usado ao navegar os conteúdos de um repositório via cgit. É possível clicar em qualquer link (commit ou branch) e baixar um tgz do repositório no momento. Tudo isso é alimentado por git archive. Na verdade, você pode criar um arquivo a partir de um repositório remoto, sem precisar de um clone explícito – mas é importante notar que a maioria dos repositórios http não suporta isso.
(master) $ git archive --format tar -9 --remote ssh://server.org/path/to/git > /tmp/remotearchive.tgz
Finalmente, é possível extrair apenas um subconjunto de arquivos em vez de todo o repositório. Se quiser gerar apenas o docs para um projeto, e eles estiverem todos presentes na pasta docs/, então você poderia criar um arquivo contendo apenas isso com:
(master) $ git archive --format tar -9 HEAD docs > /tmp/docs.tgz
É bastante comum que git describe será usado em conjunto com o git archive na criação do nome do arquivo de saída, e, opcionalmente, o prefixo global para colocar na saída arquivo compactado:
(master) $ NAME=project-`git describe`
(master) $ git archive --format tar -9 HEAD docs > ${NAME}-docs.tgz
?
Texto original disponível em http://alblue.bandlem.com/2011/09/git-tip-of-week-git-archive.html



