Cómo hacerlo con Git

La OCA hace tiempo publicó una receta para hacer migraciones de código con Git, que me sirvió como guía.

A continuación os pongo los comandos a seguir. En estas instrucciones verás que a veces hago checkout a un commit concreto. Esto es para asegurarme de que el ejemplo sea eternamente reproducible, pero no haría falta en otro caso normalmente. Os pongo en un comentario cuál sería la referencia normal a poner ahí en vez del hash del commit.

$ git clone https://github.com/OCA/partner-contact.git --branch 8.0
$ cd partner-contact
$ git checkout 21c3235  # origin/8.0
$ git checkout -b migration-base
$ git remote add antiun-odoo-addons https://github.com/Antiun/antiun-odoo-addons.git
$ git fetch antiun-odoo-addons 8.0
$ git checkout d934c36  # antiun-odoo-addons/8.0
$ git checkout -b migration1
$ module=crm_department
$ git filter-branch --subdirectory-filter $module --force
$ git filter-branch --force --tree-filter "mkdir -pv $module; git mv -k * $module" HEAD
$ git rebase 21c3235  # origin/8.0
$ git checkout d934c36  # antiun-odoo-addons/8.0
$ git checkout -b migration2
$ module=crm_partner_department
$ git filter-branch --subdirectory-filter $module --force
$ git filter-branch --force --tree-filter "mkdir -pv $module; git mv -k * $module" HEAD
$ git rebase migration1
$ git branch --delete migration1
$ mv crm_partner_department partner_contact_department
$ git add .
$ git commit --message "Rename to partner_contact_department"

A continuación ya tendría mi rama migration2 lista para hacer las modificaciones que quiera y mandar mi PR.

La sensación después de hacer esto es:

[caption id="attachment_926" align="aligncenter" width="195"]Feel like a hacker Feel like a hacker[/caption]

Cómo hacerlo con Mercurial

Enseguida me pregunté si esto se podría hacer con Mercurial, y sorprendentemente como no podía ser de otra forma, es mucho más sencillo (al menos, de recordar). Necesitarás activar la extensión Convert y luego crear un fichero que llamaré filemap.txt con este contenido:

include crm_department
include crm_partner_department
rename crm_partner_department partner_contact_department

Ahora ejecutaremos estos comandos:

$ git clone https://github.com/OCA/partner-contact.git --branch 8.0
$ git clone https://github.com/Antiun/antiun-odoo-addons.git --branch 8.0
$ hg convert --rev d934c36 --filemap filemap.txt antiun-odoo-addons antiun-odoo-addons-hg
$ hg convert --rev 21c3235 partner-contact partner-contact-hg
$ cd partner-contact-hg
$ hg update
$ hg pull --force ../antiun-odoo-addons-hg/
$ hg merge
$ hg commit --message "Rename to partner_contact_department

La sensación, después de hacer esto es:

[caption id="attachment_927" align="aligncenter" width="250"]Hacking like a sir Hacking like a sir[/caption]

Y, por supuesto, esto usando tan solo extensiones oficiales de Mercurial (las que vienen instaladas pero desactivadas), que si usas hg-git (dnf install hg-git) puedes hacer pull y push directamente a repositorios Git.