tener - ¿Cómo aplicar un parche de Git a un archivo con un nombre y una ruta diferentes?
¿qué hace git log-oneline? (4)
Tengo dos repositorios. En uno, hago cambios al archivo ./hello.test
. Confirmo los cambios y creo un parche de esa confirmación con git format-patch -1 HEAD
. Ahora, tengo un segundo repositorio que contiene un archivo que tiene los mismos contenidos que hello.test pero se coloca en un directorio diferente con un nombre diferente: ./blue/red/hi.test
. ¿Cómo hago para aplicar el parche antes mencionado al archivo hi.test
? git am --directory=''blue/red'' < patch_file
pero eso, por supuesto, se queja de que los archivos no tienen el mismo nombre (¿y pensé que a Git no le importaba?). Sé que probablemente podría editar el diff para aplicarlo a ese archivo específico, pero estoy buscando una solución de comando.
Entiendo que los dos archivos son exactamente iguales en su situación, por lo que es probable que el parche tenga éxito.
Sin embargo, en caso de que desee aplicar un parche a un archivo similar, pero no exactamente el mismo, o si desea realizar un parche interactivo, usará la combinación de tres vías.
Digamos que modificó el archivo A
, denotemos A~1
como la versión anterior, y desea aplicar la diferencia entre A~1
a A
para el archivo B
Abra una herramienta de combinación de tres vías, por ejemplo Beyond Compare, la ruta del panel izquierdo es A
, el panel central es el antecesor común, por lo que la ruta es A~1
, la ruta del panel derecho es B
Luego, el panel inferior muestra el resultado de aplicar la diferencia entre A~1
a A
para el archivo B
La siguiente figura ilustra la idea.
Hay una solución simple que no implica la edición manual de parches ni el script externo.
En el primer repositorio (esto también puede exportar un rango de confirmación, use -1
si desea seleccionar solo una confirmación):
git format-patch --relative <committish> --stdout > ~/patch
En el segundo repositorio:
git am --directory blue/red/ ~/patch
En lugar de usar --relative
in git format-patch
, otra solución es usar la opción -p<n>
en git am
para quitar n
directorios de la ruta de los parches, como se menciona en una respuesta a una pregunta similar .
También es posible ejecutar git format-patch --relative <committish>
sin el --stdout
, y generará un conjunto de archivos .patch
. Estos archivos se pueden alimentar directamente a git am
con git am --directory blue/red/ path/to/*.patch
.
Respondiendo a mi propia pregunta con un script que hace esto: https://github.com/mprpic/apply-patch-to-file
En lugar de modificar manualmente el archivo de parche, solicita al usuario el archivo de destino, modifica el parche y lo aplica al repositorio en el que se encuentra actualmente.