2010-11-08 23 views
37

Como mi pregunta dice, después de cambiar archivos y agregar nuevos archivos en mi repositorio, normalmente confirmo archivos con git, pero a veces necesito todos los archivos modificados/modificados copiados en una carpeta por razones de organización.Git: cómo obtener todos los archivos modificados y nuevos en una carpeta o zip?

¿Alguna opción?

+0

Si nos dice lo que realmente está tratando de lograr, nuestras respuestas pueden ser un poco más útiles. – Cascabel

+0

Depende, a veces simplemente para ftp ellos –

+0

Pero "para ftp ellos" no es un objetivo en sí mismo. ¿Cuál es la razón de hacer esto? Nunca quise crear un archivo zip de solo los archivos modificados, así que me pregunto sobre el caso de uso. –

Respuesta

48

Suponiendo que quiere decir que aún no se ha comprometido y desea empaquetar todos los archivos que actualmente tienen modificaciones locales, puede obtener la lista de archivos modificados con git ls-files --modified. Si desea los archivos que fueron modificados por la última confirmación, puede usar git diff --name-only HEAD^. De donde va usted depende de usted. Ejemplos:

zip modified-files.zip $(git ls-files --modified) 
cp $(git ls-files --modified) ../modified-files 

Tenga en cuenta que esto está utilizando actualmente las versiones de los archivos en el árbol de trabajo.

Si tiene espacios en los nombres de los archivos, tendrá que ir a un poco más de problemas.

(Por supuesto, dependiendo de lo que realmente está tratando de hacer, es posible que esté buscando git stash, que guarda todos los archivos modificados y le deja con un árbol de trabajo limpio, o simplemente podría querer hacer un temporal rama para comprometerse a).

+1

sin compromiso, ¿cómo puedo obtener los nuevos archivos también? –

+0

Cuando digo nuevos archivos, es decir, antes de agregarlos al repositorio –

+2

, creo que encontré lo que estaba buscando: cp $ (git ls-files --modified --others) modified-files. Muchas gracias. –

43

Para hacer exactamente lo que solicitó (suponiendo que ya comprometidos y desea crear un archivo de los archivos modificados por la última confirmación), se puede hacer:

git archive --format=zip HEAD `git diff HEAD^ HEAD --name-only` > a.zip 

archivos Si ha eliminado en una confirmación , para evitar el uso de error pathspec --diff-filter=d:

git archive --format=zip HEAD `git diff --diff-filter=d HEAD^ HEAD --name-only` > a.zip 

Pero tal vez usted realmente desea crear un parche usando:

git diff HEAD^ HEAD > a.patch 

y aplicar este parche donde lo necesite usando:

patch -p1 < a.patch 

Por supuesto, la aplicación de un parche sólo funciona si el directorio de destino ya contiene la versión anterior de su repositorio.

+1

, recomiendo usar 'git format-patch' en lugar de' git diff' en un archivo – knittl

+1

después de confirmar, ¿cómo puedo obtener los archivos nuevos también? . –

+0

¿Por archivos nuevos se entiende archivos sin seguimiento en su directorio de trabajo? Bueno, solo dinos lo que realmente quieres lograr. –

11

Si usa TortoiseGIt, también proporciona esto.
Elija la carpeta, en el explorador
Haga clic derecho, elija el menú, TortoiseGit-> Mostrar registro.

Seleccione el directorio de trabajo y la última versión compartida.
Haga clic derecho. Comparar revisiones Seleccione los archivos que desea guardar/exportar.
Haga clic derecho. Exportar a la carpeta. Hecho.

+0

Wow ... esto es muy útil ... gracias @Aftershock ... – daxsorbito

+0

Ojalá el TortoiseGit herramienta de exportación le permitió seleccionar múltiples confirmaciones. – Corgalore

0
mkdir -p /c/temp/blah && cp $(git diff <your commit hash> --name-only) /c/temp/blah 

Estoy usando Git Bash en windows.

1

Aquí hay una secuencia de comandos que puede hacer que este proceso sea mucho más fácil, copiará todos los archivos modificados en el directorio definido utilizado y también mantendrá la estructura de directorios de la base de códigos.

ejecución: sh scr.sh

============================================= ===

#!/bin/sh 
FILES=`git ls-files --modified` 
for x in $FILES 
do 
     prev_dir=$PWD 
     echo "MY Dir = $prev_dir" 
     mkdir -p $1/$x 
     cd $1/$x 
     cd ../ 
     rm -r * 
     cp $prev_dir/$x ./. 
     cd $prev_dir 
done 

======================================== ========

Cuestiones relacionadas