Cree un parche o un archivo diff desde el repositorio git y aplíquelo a otro repositorio git diferente

155

Trabajo en un proyecto basado en WordPress y quiero parchear mi proyecto en cada nueva versión de lanzamiento de WP. Para esto, quiero generar un parche entre dos confirmaciones o etiquetas.

Por ejemplo, en mi repositorio /www/WPhago esto:

$git patch-format com1..com2 --stdout > ~/patchs/mypatch.patch

O

$git patch-format tag1..tag2 --stdout > ~/patchs/mypatch.patch

/www/WP git natif WordPress

/www/myproject Mi proyecto git basado en WordPress

La git applylínea de comando no funciona, creo que porque estamos en diferentes repositorios.

¿Puedo generar un archivo de parche sin confirmación, solo un diferencial y aplicarlo a otro repositorio git?

Gracias de antemano.

zatamina
fuente

Respuestas:

243

Simplemente puede usar git diffpara producir un diff unificado adecuado para git apply:

git diff tag1..tag2 > mypatch.patch

Luego puede aplicar el parche resultante con:

git apply mypatch.patch
Enrico Campidoglio
fuente
1
Gracias Enrico, solía $git diff -u tag1..tag2 > mypatch.patchy $git apply --stat > mypatch.patchla respuesta es 0 files changedalguna otra sugerencia por favor? :)
zatamine
Debe especificar la ruta al archivo de revisión como argumento de git apply. Actualicé mi respuesta con un ejemplo.
Enrico Campidoglio
1
Usé lo git diff -p tag1 tag2 > my.patchque funcionó bien.
barclay
¿Cómo hago parches en formato diff unificado? sourceware.org/glibc/wiki/… dice Only unified diff (-uNr) format is acceptable.pero cuando lo intento git diff -uNr tag1..tag2 > mypatch.patchrecibo el mensajeusage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
Aaron Franke
2
Tenga cuidado git diff ...+ git apply ...no maneje los archivos eliminados / movidos correctamente ... cuando git format-patch ...+ git am ...do.
Vrince
50

Para producir parches para varias confirmaciones, debe usar el format-patchcomando git, p. Ej.

git format-patch -k --stdout R1..R2

Esto exportará sus confirmaciones a un archivo de revisión en formato de buzón.

Para generar el parche para la última confirmación, ejecute:

git format-patch -k --stdout HEAD^

Luego, en otro repositorio, aplique el parche mediante el amcomando git, p. Ej.

git am -3 -k file.patch

Ver: man git-format-patchy git-am.

kenorb
fuente
1
¿Qué pasa con un parche que se puede aplicar patch -p1? sourceware.org/glibc/wiki/…
Aaron Franke
Estaba moviendo el parche de Linux a Winodws, así que tuve que usar --ignore-whitespace como se menciona aquí stackoverflow.com/questions/13190679/…
Mahesh
2
@AaronFranke, puedes probar la opción '-p': git format-patch -p HEAD ^ 1
Piroxiljin
Cabe destacar que esto tiene la ventaja de mantener los mensajes de confirmación, el autor y las fechas de confirmación de las confirmaciones originales.
M. Justin
0

Como complemento, para producir un parche para solo una confirmación específica, use:

git format-patch -1 <sha>

Cuando se genera el archivo de parche, asegúrese de que su otro repositorio sepa dónde está cuando usa git am ${patch-name}

Antes de agregar el parche, use git apply --check ${patch-name}para asegurarse de que no haya conflicto.

Eugene
fuente