¿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í.

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.


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


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.


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

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

¡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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.