Solo quiero obtener una lista de archivos modificados entre dos revisiones, que es simple:
git diff -–name-only commit1 commit2 > /path/to/my/file
Pero, ¿qué debo escribir si quiero copiar todos los archivos enumerados en otro lugar? Y necesito una estructura de directorios completamente idéntica para los archivos copiados.
Por ejemplo, he modificado y agregado archivos:
/protected/texts/file1.txt
/protected/scripts/index.php
/public/pics/pic1.png
Quiero tener en /home/changes/
todos esos archivos modificados y agregados:
/home/changes/protected/texts/file1.txt
/home/changes/protected/scripts/index.php
/home/changes/public/pics/pic1.png
git format-patch
puede hacer esto para los rangos de confirmación.git diff commit1 commit2 > my.patch
y luegocd other/path; patch -p1 < my.patch
. ¿Por qué tiene que hacerse con copias completas de los archivos? Si es porque cree que el parche podría no aplicarse, y por lo tanto el otro directorio no está realmente en elcommit1
estado, que realmente debería copiar todo desde elcommit2
estado ...Respuestas:
Pruebe el siguiente comando, que he probado:
fuente
cp --parents
pista, ¡he querido esa opción durante años y nunca supe que existía! .. obviamente nunca me molesté en buscarlo tampoco = \--parents
opción decp
no está disponible.IFS=$'\n'
primero puede hacerlo. (Preferiblemente en un subshell para no alterar su valor IFS original)cp: cannot stat 'git diff --name-only': No such file or directory
en git bash en windows. ¿Qué estoy haciendo mal? El directorio de destino existeLo siguiente debería funcionar bien:
Para explicar más a fondo:
El
-z
a congit diff --name-only
significa generar la lista de archivos separados con bytes NUL en lugar de líneas nuevas, en caso de que sus nombres de archivo tengan caracteres inusuales.El
-0
toxargs
dice que interprete la entrada estándar como una lista de parámetros separados por NUL.El
-IREPLACE
es necesario ya que por defectoxargs
agregaría los parámetros al final delrsync
comando. En cambio, eso dice ponerlos donde está el últimoREPLACE
. (Ese es un buen consejo de esta respuesta de Falla del servidor ).El
-a
parámetro arsync
significa preservar permisos, propiedad, etc. si es posible. Los-R
medios para utilizar la ruta relativa completa al crear los archivos en el destino.Actualización: si tiene una versión anterior de
xargs
, deberá usar la-i
opción en lugar de-I
. (El primero está en desuso en versiones posteriores defindutils
).fuente
xargs --version
dice?-i
en su lugar, que está en desuso en versiones posteriores: 4.1 es bastante antiguo ahora. Actualizaré mi respuesta.-I
en algunas versiones, así que tal vez prueba en su-I REPLACE
lugar.-I
solo se admite desdefindutils
4.2.10, lanzado en diciembre de 2004.--diff-filter=d
para excluir archivos eliminados de la lista. De lo contrario, obtendrá errores al intentar copiarlos en la carpeta de cambios. De lo contrario, gran respuesta. ¡Gracias!Aquí hay una frase:
Enumere los archivos modificados y empaquételos como * .zip:
Enumere los últimos archivos modificados confirmados y empaquételos como * .zip:
fuente
sed.exe
? Todavíazip
no me encuentro en Windows.PATH
variable env.fuente
https://stackoverflow.com/users/79061/sebastian-paaske-t%c3%b8rholm
fuente
Funciona perfectamente
fuente
Nadie ha mencionado
cpio
cuál es fácil de escribir, crea enlaces duros y maneja espacios en los nombres de archivo:fuente