Cómo hacer un cherry-pick sin descargar todo el histórico de un proyecto en GitHub

Categorías: Control de versiones Programación

Primero, el contexto: quería abrir este backport a OCB 9.0, pero había clonado así:

$ git clone --depth 100 --branch 9.0 https://github.com/OCA/OCB.git

El problema ahora es que para hacer cherry-pick del commit correspondiente en Odoo 10.0, hubiera necesitado mucho tiempo descargando todo ese árbol de código, que es considerablemente grande.

Es por eso que usé un par de herramientas que nos dan git y GitHub para estos menesteres:

En cuanto a GitHub, para cada commit o pull request, siempre podemos añadir a la URL:

  • .diff para obtener el diff con respecto a la rama base
  • .patch para obtener el parche

Ejemplos para el commit en cuestión:

  • https://github.com/odoo/odoo/commit/de62e33618211fd754ad6e372ac93805cce58770
  • https://github.com/odoo/odoo/commit/de62e33618211fd754ad6e372ac93805cce58770.diff
  • https://github.com/odoo/odoo/commit/de62e33618211fd754ad6e372ac93805cce58770.patch

Es por esto que pude aplicar el parche sin necesidad de descargar más histórico en Git:

$ git checkout -b 9.0-event-no_mail_cancelled # Crear una nueva rama para el PR
$ curl -sSL 'https://github.com/odoo/odoo/commit/de62e33618211fd754ad6e372ac93805cce58770.patch' | git am -3 --keep-non-patch -
Applying: [PATCH] [FIX] calendar, event: do not send emails to canceled attendees
error: sha1 information is lacking or useless (addons/calendar/models/calendar.py).
error: could not build fake ancestor
Patch failed at 0001 [PATCH] [FIX] calendar, event: do not send emails to canceled attendees
The copy of the patch that failed is found in: .git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".

💥 ¡Error! Al parecer estoy descargando cambios para addons/calendar/models/calendar.py, un archivo que en la rama 9.0 no existía. El parche para dicho archivo tampoco es que me sirva de nada, así que lo ignoraremos:

$ git am --abort # Cancelamos lo que estábamos haciendo
$ curl -sSL 'https://github.com/odoo/odoo/commit/de62e33618211fd754ad6e372ac93805cce58770.patch' | git am -3 --keep-non-patch --exclude addons/calendar/models/calendar.py -
Applying: [PATCH] [FIX] calendar, event: do not send emails to canceled attendees

¡Listo! Ahora, si tengo que hacer algún cambio adicional a algún fichero, puedo hacerlo tranquilamente. También si quiero cambiar el mensaje de commit, nuestro viejo amigo git commit --amend nos puede servir.

Finalmente, subo el cambio a mi repositorio para poder abrir el PR:

$ git remote add tecnativa [email protected]:Tecnativa/odoo.git # El PR lo tengo que hacer desde nuestro repo
$ git fetch tecnativa 9.0 # Esto sirve para que mi clon local pueda generar la diferencia de commits entre los repositorios de OCB y Tecnativa
$ git push -u tecnativa 9.0-event-no_mail_cancelled # Subo los cambios de esta rama, que crearán la rama remota que no existía

¡Luego, creas el PR y listo!

Ver también

Comentarios

comments powered by Disqus