Pregunta

Quiero usar algo como el siguiente comando para crear un tarball para implementar:

tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`

El comando interno git diff produce una lista de archivos con relativa, incluida la ruta relativa cuando lo ejecuto por separado.

Sin embargo, me encuentro con dos problemas, necesito poder escapar automáticamente de los espacios en la salida, por lo que tar no se queja de los archivos que contienen espacios y cuando el tar se crea, todos los archivos tienen un 'archivo oculto' duplicado precedido por un '.' eso no aparece con ls -al . Estos son metarchivos específicos de OSX como lo indica kch.

De todos modos, ¿alguien conoce la solución a estos problemas, o existe una forma sencilla de escribir esto?

¿Fue útil?

Solución

Me decidí por la siguiente solución con sed.

tar cjf ~/deploy.tar.bz2 \
`git diff --name-only 0abc 1def|sed -e "s/ /\\\ /g"`

Otros consejos

Los archivos de puntos ocultos, ¿son archivos de subrayado de puntos?

Si para el archivo foo tiene otro ._foo , y está en una Mac, el archivo de subrayado de puntos es donde se guarda la bifurcación / metadatos del recurso de archivo .

En cuanto a la salida de git, podría intentar canalizarla a través de sed o perl para la cotización. Creo que xargs también podría ayudar aquí.

¿Por qué no usar la opción --files-from = FILE o -T FILE de tar, donde FILE puede ser '-' para indicar la entrada estándar?

 git diff --name-only 0abc 1def | tar -T - cjf ~/deploy.tar.bz2

No debería tener problemas con espacios o pestañas en los nombres de archivo, o con comillas simples, o comillas inversas o barras diagonales inversas (creo que su solución tendría problemas con comillas simples '' '' en el nombre de archivo). Es posible que tenga problemas con las nuevas líneas en los nombres de archivo, al igual que en la solución IFS.

Si el tamaño no importa, puedes usar git archive .

No estoy seguro de si es posible crear un tarball que contenga solo las diferencias entre dos confirmaciones.

Puedes probar

eval tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def | while read x; do echo "'""$x""'"; done`

o intente lo mismo usando sed, o

IFS='
' tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`

Tenga en cuenta que solo hay una nueva línea en IFS.

Sin embargo, si el nombre de sus archivos contiene nuevas líneas, está condenado.

Aquí hay otra solución más elegante que funciona alrededor de los espacios de escape en los nombres de archivo

git diff --name-only 0abc 1def | \
    tr '\n' '\0' | \
    xargs -0 tar -rjvf ~/deploy.tar.bz2

Como señaló jpalecek, uno no querría ejecutar " tar -c ... " varias veces, es mejor usar -r.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top