2010-06-18 11 views
40

Mi árbol de fuentes contiene varios directorios que usan el control de código fuente de Git, y necesito controlar todo el árbol, excluyendo cualquier referencia a los metadatos de Git o archivos de registro personalizados.Tarballing sin metadatos de Git

Pensé que podría usar una combinación de find/egrep/xargs/tar, pero de alguna manera el archivo tar contiene los directorios .git y los archivos * .log.

Esto es lo que tengo:

find -type f . | egrep -v '\.git|\.log' | xargs tar rvf ~/app.tar 

Puede alguien explicar mi malentendido? ¿Por qué el procesamiento de tar de los archivos que find y egrep está filtrando?

Estoy abierto a otras técnicas también.

Respuesta

74

Usted recibirá una sorpresa desagradable cuando el número de archivos de aumentar a más de un comando xargs: A continuación, en primer lugar hacer un archivo tar de los primeros archivos y sobrescribir la misma archivo tar con el resto de los archivos.

GNU tar tiene la opción --exclude la que va a resolver este problema:

tar cvf ~/app.tar --exclude .git --exclude "*.log" . 
+3

también funciona con bsdtar en OS X. – rexford

2

git-archive puede ser lo que estás buscando.

+0

. Dado que se trata de múltiples gits en el árbol fuente. – zaf

2

Puede hacerlo sin grep. encontrar es poderosa

find . -type f -not \(-iname ".git" -or -iname ".log" \) | xargs ... 
+0

El problema fueron mis parámetros de búsqueda. Ver mi respuesta Gracias por la alternativa. – zaf

11

intentar algo como esto:

git archive --format=tar -o ~/tarball.tar -v HEAD 

Añadir sus archivos .log y todo lo que no quiere ser embalado para su archivo .gitignore.

4

[bofetada] Bah! ¡Los parámetros para encontrar estaban en el orden incorrecto! No vi las advertencias porque desaparecieron de la pantalla. Esto permitió '.' pasar por egrep, lo que causó que el alquitrán absorbiera todo.

Eso me enseñará a ahogar mensajes importantes en la depuración detallada.

Esto funciona:

find . -type f | egrep -v '\.git|\.log' | xargs tar cvf ~/app.tar 
9

Para excluir los directorios del sistema de control de versiones:

tar --exclude-vcs

Esto excluirá SVN, Git metafiles etc.

0

Para hacerlo desde fuera del directorio de la aplicación:

tar cvfz app.tar.gz --exclude ".git/*" --exclude ".git" app/ 
40

Usted puede tratar directamente con la opción de alquitrán --exclude-VCS:

--exclude-vcs: 
      Exclude version control system directories 

Por ejemplo:

tar cvfj nameoffile.tar.bz2 directory/ --exclude-vcs 

Funciona con Git.

+1

Gracias pero "Opción --exclude-vcs no es compatible" con mi versión de tar. – zaf

+1

@zaf yes = GNU tar solo. MacOSX se envía con bsdtar que no lo tiene. – marko

+0

@Marko Aha, gracias por iluminarme. Estos detalles me molestan siempre. – zaf

3

El alquitrán GNU más nuevo tiene la opción de excluir automáticamente los directorios de control de versiones mediante el uso de flag --exclude-vcs. Esto también se ocupará de .git.

0

Para mí, el contenido .gitignore es lo que necesitaba:

tar cvfz $PROJECT.tar.gz --exclude-from=$PROJECT/.gitignore $PROJECT

--exclude-from está leyendo el contenido del archivo - y exlucde los patrones que figuran allí

Probablemente no
+0

también hay --exclude-vcs-ignores que lee patrones de exclusión de VCS ignoran archivos. –