Como zipar uma pasta, mas excluir a subpasta .git

196

Estou tentando criar um arquivo zip de uma pasta e gostaria de excluir a .gitsubpasta do arquivo zip resultante.

Eu fui para a pasta pai da pasta que quero compactar ( chamada bitvolution ) e estou fazendo:

zip -r bitvolution.zip bitvolution -x ".git"

Mas isso não exclui a .gitsubpasta.

Eu tentei várias combinações, -x .git*, -x \.git/*, -x .git/\*, -x \.git/\*. Eu também tentei usar o caminho completo para o argumento de exclusão ... mas simplesmente não cheguei lá.

Tom
fonte

Respostas:

234

A expressão correta é -x *.git*, portanto, o comando completo deve ser:

zip -r bitvolution.zip bitvolution -x *.git*

Uma explicação de http://selfsolved.com/problems/zip-command-exclude-svn-director :

O encantamento correto é

zip -9 -r --exclude=*.svn*  foo.zip [directory-to-compress]

Você também pode adicionar a
--exclude=*.DS_Store*para excluir os irritantes arquivos de metadados da exibição do diretório do Mac OS X.

Observe que a expressão transmitida --excludeestá usando o caminho do diretório relativo original inteiro como a sequência original para a qual corresponder. Então, .svn/*por si só não funciona; o caractere curinga à frente garante que ele corresponda aos .svndiretórios em qualquer lugar da árvore de diretórios.

Isaías
fonte
20
Eu tive que enrolar o glob entre aspas ou escape os asteriscos com barras invertidas, como zip --exclude '*.git*' -r directory.zip directoryouzip --exclude \*.git\* -r directory.zip directory
Dmitry Minkovsky
6
Se você está preocupado com a perda de outros arquivos chamados something.gitwhatever, também pode usar --exclude /.git*.
Erin Ligue
4
em ZSH eu tive que adicionar uma barra invertida:-x \*.git\*
DmitrySandalov 6/14
2
Minha alternativa preferida para barras invertidas e citações em zsh:noglob zip -r out.zip someFolder -x *someExcludedFolder*
Sébastien
Como usá-lo com alcatrão? Não está funcionando com o comando tar.
RN Kushwaha
124

Se você estiver tentando compactar um projeto armazenado no Git, use o git archivecomando De dentro do diretório de origem:

git archive -o bitvolution.zip HEAD

Você pode usar qualquer ID de confirmação ou tag em vez de HEADarquivar o projeto em um determinado momento.

Se você deseja adicionar um prefixo (por exemplo, uma pasta de nível superior) a cada arquivo:

git archive -o bitvolution.zip --prefix=bitvolution/ HEAD

Você também pode ajustar o nível de compactação entre 0 (sem compactação) e 9 (compactação máxima) inclusive, por exemplo

git archive -o bitvolution.zip -9 HEAD

Para outras opções, consulte a página de ajuda ( git help archive).

Blair
fonte
25
Isso não apenas incluirá a pasta git, mas também tudo o que estiver no arquivo gitignore também será excluído. Você senhor recebe um voto positivo.
precisa saber é o seguinte
1
Apenas o que eu estava procurando fazer!
Bjarte
Estou atrasado para a festa, mas isso absolutamente me surpreendeu. Ótima resposta!
Tom
eu quero saber porque não é esta a melhor resposta
nabtron
Para mim, este foi o maior até hoje ...
Shawn Cicoria
27

Adicionei barra invertida:

zip -r bitvolution.zip bitvolution -x \*.git\*

página de manual sobre barra invertida:

A barra invertida evita a substituição do nome de arquivo do shell, para que a correspondência de nome seja realizada por zip em todos os níveis de diretório.

Priit Tamboom
fonte
prepending asteriscos com garfos de barra para mim no Ubuntu 14.04 para excluir diretórios
Dimitry K
6

Supondo que você tenha o git instalado na máquina em que está fazendo isso, também poderá usar o próprio git para criar seu arquivo.

git archive --format=zip HEAD -o bitvolution.zip
Tatu Lahtela
fonte
2

Se você estiver usando zsh, o comando deve se parecer com:

zip -r target_name.zip source_dir -x '/*.git/*'

Se você usar: zip -r target_name.zip source_dir -x /*.git/*. sem 'regex', o zsh será processado antes da execução do zip. Você receberá uma mensagem de erro:

zsh: no matches found: /*.git/*
g10guang
fonte
Obrigado! Foi o que funcionou para mim usando o Bash no Ubuntu no Windows.
Adriano Monecchi 30/08/18
Não entendi como esse padrão funciona, mas funcionou para mim no zsh.
insign