Tar uma pasta sem arquivos .git?

16

Se eu tar uma pasta que é um repositório git, posso fazê-lo sem incluir os .gitarquivos relacionados? Se não, como eu faria isso através de um comando?

chrisjlee
fonte

Respostas:

23

Dê uma olhada primeiro git help archive. archiveé um comando git que permite criar arquivos contendo apenas arquivos rastreados pelo git. Provavelmente o que você está procurando. Um exemplo listado no final da página do manual:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz
Stéphane Gimenez
fonte
6
isso apenas arquiva o repositório root do git. Se submodules foram usados ​​- seus diretórios estarão vazios.
Stann
@Stann: Obrigado, de outro usuário submodule
Mark K Cowan
22

Resposta mais simples: adicionar --exclude-vcs

--exclude-vcs

Isso exclui todos os diretórios do sistema de controle de versão

Pessoalmente eu uso

tar -zcvf foo.tar.gz ./FOLDER_NAME --exclude-vcs

então tudo que você precisa fazer é adicionar o --exclude-vcs no final do comando.

mtelesha
fonte
Todos conhecidos , suponho? ;)
phk 30/10/16
3
Todas as opções precisam estar juntas antes dos argumentos no GNU / Linux.
Josh Habdas
2
Conforme declarado no GNU / Linuxtar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME
Michael Irey
20

Se você deseja que o archive inclua os arquivos rastreados pelo git, mas não o próprio repositório git ou qualquer arquivo gerado ou não rastreado, usegit archive .

Se você deseja excluir especificamente, .gitmas inclui todo o resto, no Linux ou FreeBSD ou OSX ou Cygwin, o tar possui uma opção simples para excluir um diretório:

tar -c --exclude .git -f - foo | gzip >foo.tgz

Com o GNU tar (ou seja, no Linux ou Cygwin), você pode reduzi-lo para tar czf foo.tgz --exclude .git foo.

A maneira POSIX de criar arquivos é pax.

pax -w -t -s '!.*/\.git$!!' -s '!.*/\.git/.*!!' foo | gzip >foo.tgz
Gilles 'SO- parar de ser mau'
fonte
Será que gitcompila em qualquer sistema onde tarnão está disponível? :-)
Stéphane Gimenez
1
@ StéphaneGimenez Provavelmente não. Mas ele compila em sistemas onde tarnão há --excludeopção, como o OpenBSD (que duplica a sopção do pax , mas essa não é uma extensão comum da sintaxe do comando tar).
Gilles 'SO- stop be evil'
0

Graças a uma resposta que recebi em uma das minhas perguntas , descobri outra solução. Portanto, por uma questão de integridade, aqui está uma solução que utiliza find:

find . -path './.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

E se você deseja excluir possíveis .gitpastas dentro da (sub) + pasta:

find . -path '*/.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

O último também pode ser alcançado através de:

find . -type d -name '.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Bastante útil se você puder fazer uso de outras técnicas de filtragem de find, por exemplo, data de modificação, permissões,…

(Como geralmente são assumidos nomes de arquivo bem-formados, caso contrário, você precisa usar bytes nulos como separadores, o que pode significar -print0para finde --nullpara tarse houver suporte.)

phk
fonte