¿Cómo comprimo una carpeta pero excluyo la subcarpeta .git

196

Estoy tratando de crear un archivo zip desde una carpeta y me gustaría excluir la .gitsubcarpeta del archivo zip resultante.

He ido a la carpeta principal de la que quiero comprimir ( llamada bitvolution ) y estoy haciendo:

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

Pero no excluye la .gitsubcarpeta.

He intentado varias combinaciones, -x .git*, -x \.git/*, -x .git/\*, -x \.git/\*. También intenté usar la ruta completa para el argumento de exclusión ... pero simplemente no llegué allí.

Tom
fuente

Respuestas:

234

La expresión correcta es -x *.git*, por lo que el comando completo debería ser:

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

Una explicación de http://selfsolved.com/problems/zip-command-exclude-svn-director :

El encantamiento correcto es

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

También puede agregar un
--exclude=*.DS_Store*para excluir los molestos archivos de metadatos de visualización del directorio de Mac OS X.

Observe que la expresión que se pasa --excludeestá usando la ruta de directorio relativa original completa como la cadena original con la que debe coincidir. Entonces, .svn/*por sí solo no funciona; el carácter comodín en el frente asegura que coincida con los .svndirectorios en cualquier lugar del árbol de directorios.

Isaias
fuente
20
Tuve que envolver el globo entre comillas o escapar de los asteriscos con barras invertidas, como zip --exclude '*.git*' -r directory.zip directoryozip --exclude \*.git\* -r directory.zip directory
Dmitry Minkovsky
66
Si le preocupa perder otros archivos llamados something.gitwhatever, también puede usarlos --exclude /.git*.
Erin llama el
44
en ZSH tuve que agregar una barra invertida:-x \*.git\*
DmitrySandalov
2
Mi alternativa preferida a las barras invertidas y las comillas en zsh:noglob zip -r out.zip someFolder -x *someExcludedFolder*
Sébastien
¿Cómo usarlo con alquitrán? No funciona con el comando tar.
RN Kushwaha
124

Si está intentando comprimir un proyecto que está almacenado en Git, use el git archivecomando. Desde dentro del directorio de origen:

git archive -o bitvolution.zip HEAD

Puede usar cualquier commit o ID de etiqueta en lugar de HEADarchivar el proyecto en un punto determinado.

Si desea agregar un prefijo (por ejemplo, una carpeta de nivel superior) a cada archivo:

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

También puede ajustar el nivel de compresión entre 0 (sin compresión) y 9 (compresión máxima) inclusive, por ejemplo

git archive -o bitvolution.zip -9 HEAD

Para otras opciones, consulte la página de ayuda ( git help archive).

Blair
fuente
25
Esto no solo no incluirá la carpeta git sino que también se excluirá todo lo que esté en el archivo gitignore. Usted señor, obtenga un voto a favor.
JoeMoe1984
1
Justo lo que estaba buscando hacer!
Bjarte
Llego tarde a la fiesta, pero esto me dejó boquiabierto. ¡Gran respuesta!
Tom
Me pregunto por qué no es esta la mejor respuesta
nabtron
para mí este fue el mejor TIL hoy ...
Shawn Cicoria
27

Agregué la barra invertida:

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

página de manual sobre barra invertida:

La barra invertida evita la sustitución del nombre de archivo del shell, de modo que la coincidencia de nombre se realiza mediante zip en todos los niveles de directorio.

Priit Tamboom
fuente
anteponiendo asteriscos con horquillas para mí en Ubuntu 14.04 para excluir directorios
Dimitry K
6

Suponiendo que tiene git instalado en la máquina que está haciendo esto, también puede usar git para crear su archivo.

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

Si está utilizando zsh, el comando debería verse así:

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

Si utiliza: zip -r target_name.zip source_dir -x /*.git/*. sin 'regex', zsh procesará antes de ejecutar zip. Recibirá un mensaje de error:

zsh: no matches found: /*.git/*
g10guang
fuente
¡Gracias! Eso es lo que funcionó para mí usando Bash en Ubuntu en Windows.
Adriano Monecchi
No entendía cómo funciona este patrón, pero funcionó para mí en zsh.
insign