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á.

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.


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).


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.


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

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/*

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.