2009-11-05 19 views
8

¿Existe una manera simple de exportar/archivar solo los archivos modificados de un compromiso determinado o serie de confirmaciones en git? Parece que no puedo encontrar instrucciones claras para hacer esto (y soy nuevo en Linux/Git).Exportación/Archivado de archivos cambiados solo en Git

Estoy usando msysgit, y en general estoy bien con la implementación de repositorios enteros, pero en muchos casos es mucho más eficiente implementar pequeños arreglos de algunos archivos a la vez.

Empujar/jalar/instalar git en los servidores remotos no es realmente una opción ya que mi nivel de acceso varía entre proyectos y clientes.

¿Hay una manera recta hacia adelante a (cálculo aproximado):

pipe 'diff --names-only' to 'git-archive'? 

Respuesta

25

No creo que haya ninguna necesidad de involucrar a git-archivo. Usando --name-only, podría manchar a los archivos:

tar czf new-files.tar.gz `git diff --name-only [diff options]` 

Puesto que usted es nuevo en Linux, esto podría necesitar alguna explicación:

Los acentos abiertos en la línea de comandos hacen que el shell para ejecutar primero el comando dentro de los backticks, luego sustituye la salida de ese comando en la línea de comando de tar. Por lo tanto, se ejecuta primero el git diff, que genera una lista de nombres de archivos, uno en cada línea. Las líneas nuevas se contraen en espacios y toda la lista de archivos se coloca en la línea de comandos tar. Luego se ejecuta tar para crear el archivo dado. Tenga en cuenta que esto puede generar líneas de comando bastante largas, por lo que si tiene una gran cantidad de archivos modificados, es posible que necesite una técnica diferente.

+4

Solo para posteridades, esa técnica diferente sería algo como: 'git diff --name-only [diff options] | xargs tar -czf files.tar.gz' – jason

+2

Con 'xargs', usted tiene un problema diferente porque' xargs' ejecutará 'tar' más de una vez si hay demasiados archivos para ponerlos todos en una sola línea de comando. Esto hará que 'tar' cree un nuevo archivo .tar sobrescribiendo el anterior, por lo que solo contendrá los archivos del último lote. –

+0

¡Gracias por explicar la sintaxis! Los backticks son lo que necesitaba :) Esto funciona perfectamente en la línea de comando bash que viene con msysgit, excepto cuando hay espacios en los nombres de archivo (Windows ...). ¿Hay alguna manera de escapar de ellos automáticamente? – AKS

Cuestiones relacionadas