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-patchpuede hacer esto para los rangos de confirmación.git diff commit1 commit2 > my.patchy 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 elcommit1estado, que realmente debería copiar todo desde elcommit2estado ...Respuestas:
Pruebe el siguiente comando, que he probado:
fuente
cp --parentspista, ¡he querido esa opción durante años y nunca supe que existía! .. obviamente nunca me molesté en buscarlo tampoco = \--parentsopción decpno 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 directoryen 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
-za congit diff --name-onlysignifica 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
-0toxargsdice que interprete la entrada estándar como una lista de parámetros separados por NUL.El
-IREPLACEes necesario ya que por defectoxargsagregaría los parámetros al final delrsynccomando. En cambio, eso dice ponerlos donde está el últimoREPLACE. (Ese es un buen consejo de esta respuesta de Falla del servidor ).El
-aparámetro arsyncsignifica preservar permisos, propiedad, etc. si es posible. Los-Rmedios 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-iopción en lugar de-I. (El primero está en desuso en versiones posteriores defindutils).fuente
xargs --versiondice?-ien su lugar, que está en desuso en versiones posteriores: 4.1 es bastante antiguo ahora. Actualizaré mi respuesta.-Ien algunas versiones, así que tal vez prueba en su-I REPLACElugar.-Isolo se admite desdefindutils4.2.10, lanzado en diciembre de 2004.--diff-filter=dpara 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íazipno me encuentro en Windows.PATHvariable env.fuente
https://stackoverflow.com/users/79061/sebastian-paaske-t%c3%b8rholm
fuente
Funciona perfectamente
fuente
Nadie ha mencionado
cpiocuál es fácil de escribir, crea enlaces duros y maneja espacios en los nombres de archivo:fuente