¿Tar una carpeta sin archivos .git?

16

Si coloco una carpeta que es un repositorio git, ¿puedo hacerlo sin incluir los .gitarchivos relacionados? Si no es así, ¿cómo podría hacerlo mediante un comando?

chrisjlee
fuente

Respuestas:

23

Echa un vistazo primero git help archive. archivees un comando git que permite crear archivos que contienen solo archivos con seguimiento git. Probablemente lo que estás buscando. Un ejemplo listado al final de la página del manual:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz
Stéphane Gimenez
fuente
66
esto solo archiva el repositorio root git. Si se utilizaron submódulos, sus directorios estarán vacíos.
Stann
@Stann: Gracias, de otro usuario de submódulos
Mark K Cowan, el
22

Respuesta más simple: Agregar --exclude-vcs

--exclude-vcs

Esto excluye todos los directorios del sistema de control de versiones.

Personalmente uso

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

así que todo lo que necesita hacer es agregar --exclude-vcs al final del comando.

mtelesha
fuente
Todos los conocidos , supongo. ;)
phk
3
Todas las opciones deben estar juntas antes de los argumentos en GNU / Linux.
Josh Habdas
2
Como se indicó para GNU / Linuxtar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME
Michael Irey
20

Si desea que el archivo incluya los archivos rastreados por git, pero no el repositorio git en sí mismo o cualquier archivo generado o no rastreado, usegit archive .

Si desea excluir específicamente .gitpero incluir todo lo demás, en Linux o FreeBSD o OSX o Cygwin, tar tiene una opción simple para excluir un directorio:

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

Con GNU tar (es decir, bajo Linux o Cygwin), puede acortar esto a tar czf foo.tgz --exclude .git foo.

La forma POSIX de crear archivos es pax.

pax -w -t -s '!.*/\.git$!!' -s '!.*/\.git/.*!!' foo | gzip >foo.tgz
Gilles 'SO- deja de ser malvado'
fuente
¿Se gitcompila en cualquier sistema donde tarno está disponible? :-)
Stéphane Gimenez
1
@ StéphaneGimenez Probablemente no. Pero se compila en sistemas donde tarno tiene --excludeopción, como OpenBSD (que ciertamente duplica la sopción de pax , pero esa no es una extensión de sintaxis de comando tar común).
Gilles 'SO- deja de ser malvado'
0

Gracias a una respuesta que obtuve en una de mis preguntas , descubrí otra solución. Entonces, para completar, aquí hay una solución que utiliza find:

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

Y si desea excluir posibles .gitcarpetas dentro de (sub) + carpeta:

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

Este último también se puede lograr a través de:

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

Muy útil si puede utilizar otras técnicas de filtrado de find, por ejemplo, fecha de modificación, permisos, ...

(Como a menudo se suponen nombres de archivo bien formados, de lo contrario, debe usar bytes nulos como separadores que pueden significar -print0para findy --nullpara tarsi se admiten).

phk
fuente