Transferir código entre repositorios, con archivos renombrados

Recientemente tuve que hacer una transferencia de código fuente algo complicada. Tenía que transferir un addon de Odoo desde un repositorio a otro completamente diferente:

Veamos cómo se puede hacer con Git y con Mercurial.

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:

Feel like a hacker
Feel like a hacker

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:

Hacking like a sir
Hacking like a sir

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.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s