tipos tener tag remove qué proyecto podemos para oneline nuestros mayor log herramienta hacer hace existen etiquetas crear control git filenames patch git-patch git-am

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 .


Puede crear el parche usando git diff y luego aplicarlo usando la utilidad de patch , que le permite especificar el archivo al que desea aplicar el diff.

Por ejemplo:

cd first-repo git diff HEAD^ -- hello.test > ~/patch_file cd ../second-repo patch -p1 blue/red/hi.test ~/patch_file


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.